5

我希望我的应用程序检测外部存储状态何时发生变化。起初在我的 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 broadcastPermission, Handler scheduler. Handler 听起来很有希望,但我找不到可以接受字符串形式的进程名称的 Handler 构造函数。我觉得我的想法已经用完了。有没有办法以编程方式设置进程名称?

4

1 回答 1

1

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

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

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

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

于 2013-04-20T23:14:07.430 回答