我正在尝试以编程方式注册BroadcastReceiver以接收android.intent.action.MEDIA_MOUNTED
。但是,onReceive()
方法永远不会被触发。如果我在应用程序的清单文件中静态注册,我创建的同一个BroadcastReceiver类工作正常。
为什么会这样?有没有办法解决这个问题?我需要动态注册,因为我的BroadcastReceiver类包含我希望服务稍后查询的成员。如果我静态地捕获此Intent,那么我没有简单的方法来查询这些成员,因为我相信一旦onReceive()
完成,BroadcastReceiver的实例就会被删除。它是否正确?考虑到Android documentation对此有以下说法,我很确定就是这种情况:
如果此BroadcastReceiver是通过标记启动的,则从此函数返回后该对象不再处于活动状态。
更新1:
这是我的动态注册码:
if (externalStorageListener == null) { Log.d(TAG, "creating externalStorageListener...");
IntentFilter filterExternalStorage = new IntentFilter();
filterExternalStorage.addAction(Intent.ACTION_MEDIA_MOUNTED);
filterExternalStorage.addDataScheme("file");
filterExternalStorage.setPriority(Integer.MAX_VALUE);
externalStorageListener = new ExternalStorageBroadcastReceiver();
registerReceiver(externalStorageListener, filterExternalStorage);
}
以下是我的清单中的intent过滤器实际上有效:
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file"/>
</intent-filter>
答案 0 :(得分:1)
有时,要使用动态创建的BroadcastReceiver接收android.intent.action.MEDIA_MOUNTED,就要在清单中定义android.permission.MOUNT_UNMOUNT_FILESYSTEMS:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
答案 1 :(得分:0)
当您动态创建接收器时,与通过<receiver/>
标签创建的意图过滤器相比,您的意图过滤器可能会有所不同吗?你能告诉我们你的清单部分和代码部分吗?
此外,您可以考虑其他选项,而不是将数据存储在接收者的字段中:
在这种情况下,静态和动态创建的接收器之间没有区别。
编辑:根据提供的代码,问题可能在priority setting:
应用程序必须使用大于SYSTEM_LOW_PRIORITY且小于SYSTEM_HIGH_PRIORITY的值。
SYSTEM_HIGH_PRIORITY = 1000
答案 2 :(得分:0)
android.intent.action.MEDIA_MOUNTED操作只能由特权系统应用程序处理。第三方应用程序无法接收该操作