我希望我的應用能夠檢測外部存儲器的狀態是否發生更改。起初在我的AndroidManifest中定義了一個BroadcastReceiver。在這裏,我可以設置android:process
和android:exported
屬性是這樣的:BroadcastReceiver:以編程方式設置android:進程
<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>
然後我意識到我只在一個單一的活動使用該接收機,所以沒有必要把它實例化時,應用程序啓動,而不是我可以將其定義以編程方式在代碼中。這是我想出了:
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構造函數。我覺得我用完了想法。有沒有一種方法來設置過程名稱編程?
我想你是對的,現在我想起來了,真的沒有理由使用單獨的過程。出於好奇的後續問題:你可以通過編程設置android:exported嗎?它不適用於這個特定的例子,但我只是想知道。 – 2013-04-21 20:18:49
@AntonCherkashyn:「你能設置android:以編程方式導出嗎?」 - 我不這麼認爲。您可以通過'PackageManager'和'setComponentEnabledSetting()'以編程方式切換'android:enabled',但我不知道切換'android:exported'的方法。 – CommonsWare 2013-04-21 20:21:14