当BroadcastReceiver动态注册时,无法接收android.intent.action.MEDIA_MOUNTED

时间:2013-06-08 00:33:35

标签: android broadcastreceiver

我正在尝试以编程方式注册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>

3 个答案:

答案 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操作只能由特权系统应用程序处理。第三方应用程序无法接收该操作