BroadcastReceiver:以编程方式设置android:process

时间:2013-04-20 22:51:36

标签: android broadcastreceiver storage

我希望我的应用检测外部存储状态何时发生变化。最初在我的AndroidManifest中定义了一个BroadcastReceiver。在这里,我可以像这样设置android:processandroid:exported属性:

    <receiver android:name=".StorageStateReceiver" android:process=":storage_state" android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
            <action android:name="android.intent.action.MEDIA_MOUNTED" />
            <action android:name="android.intent.action.MEDIA_EJECT" />
            <action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
            <data android:scheme="file" />
        </intent-filter>
    </receiver>

然后我意识到我只在一个Activity中使用这个接收器,因此在应用程序启动时不需要实例化它,而是我可以在代码中以编程方式定义它。这就是我想出的:

BroadcastReceiver StorageStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Do what needs to be done
        }
    };
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
filter.addDataScheme("file");
getApplicationContext().registerReceiver(StorageStateReceiver, filter);

我把这段代码放在我活动的onCreate()方法中。

但是我找不到从代码中设置process的方法。我已经阅读了有关BroadcastReceiver和Context类的文档。 BroadcastReceiver似乎没有托管任何允许您定义进程名称的方法。另一方面,registerReceiver()可以加入两个额外的参数:String broadcastPermissionHandler scheduler。处理程序听起来很有希望,但我找不到一个Handler构造函数,它可以接受一个字符串形式的进程名称。我觉得我没有想法了。有没有办法以编程方式设置进程名称?

1 个答案:

答案 0 :(得分:1)

  

然后我意识到我只在一个Activity中使用这个接收器,因此在应用程序启动时不需要实例化它,而是我可以在代码中以编程方式定义它。

清单注册的BroadcastReceiver未在应用启动时“实例化”。仅在发送匹配的广播时才会实例化。

  

但是我找不到从代码设置进程的方法。

那是因为这是不可能的。此外,您不需要它,它会浪费RAM,CPU和电池,从而对用户造成伤害。您不应该在清单条目中拥有android:process属性,除非您知道完全且准确地为什么 您需要另一个进程。绝大多数Android应用都没有。