3

我正在尝试以编程方式注册 BroadcastReceiver 以接收android.intent.action.MEDIA_MOUNTED。但是,该onReceive()方法永远不会被触发。如果我在应用程序的清单文件中静态注册,我创建的同一个 BroadcastReceiver 类可以正常工作。

为什么会这样?有没有办法解决这个问题?我需要动态注册,因为我的 BroadcastReceiver 类包含我希望服务稍后查询的成员。如果我静态地捕捉到这个 Intent,那么我就没有简单的方法来查询这些成员,因为我相信 BroadcastReceiver 的实例会在onReceive()完成后立即被删除。这个对吗?考虑到 Android文档对此有以下说法,我很确定就是这种情况:

如果此 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-filter>
            <action android:name="android.intent.action.MEDIA_MOUNTED" />
            <data android:scheme="file"/>
        </intent-filter>
4

3 回答 3

3

有时,要使用动态创建的 BroadcastReceiver 接收 android.intent.action.MEDIA_MOUNTED,一种是在清单中定义 android.permission.MOUNT_UNMOUNT_FILESYSTEMS:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
于 2013-07-02T11:50:52.400 回答
0

可能是当您动态创建接收器时,您的意图过滤器与通过<receiver/>标签创建时不同?你能告诉我们你的清单部分和代码部分吗?

此外,您可以考虑其他选项,而不是将数据存储在接收者的字段中:

  • 内容提供者
  • 共享偏好
  • 单例对象

在这种情况下,静态和动态创建的接收器之间没有区别。

编辑:根据提供的代码,问题可能出在优先级设置中

应用程序必须使用大于 SYSTEM_LOW_PRIORITY 且小于 SYSTEM_HIGH_PRIORITY 的值。

SYSTEM_HIGH_PRIORITY = 1000

于 2013-06-08T00:50:58.963 回答
0

android.intent.action.MEDIA_MOUNTED 动作只能由特权系统应用程序处理。3rd 方应用程序无法接收该操作

于 2017-05-30T22:53:31.760 回答