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

Ant*_*hyn 5 storage android broadcastreceiver

我希望我的应用程序检测外部存储状态何时发生变化.最初在我的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>
Run Code Online (Sandbox Code Playgroud)

然后我意识到我只在一个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);
Run Code Online (Sandbox Code Playgroud)

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

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

Com*_*are 1

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

清单注册BroadcastReceiver不是“在应用程序启动时实例化”。仅当发送匹配的广播时才会实例化它。

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

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