外部ストレージの状態がいつ変化したかをアプリで検出したい。最初に、私の AndroidManifest で BroadcastReceiver を定義しました。ここで、次のようandroid:process
にandroid: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>
その後、このレシーバーは 1 つのアクティビティでのみ使用することに気付きました。そのため、アプリの起動時にインスタンス化する必要はなく、プログラムでコードで定義できます。これは私が思いついたものです:
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() は、2 つの追加の引数を受け入れることができます: String broadcastPermission
, Handler scheduler
. Handler は有望に思えますが、文字列の形式でプロセス名を受け入れる Handler コンストラクターを見つけることができませんでした。アイデアが尽きた感じです。プログラムでプロセス名を設定する方法はありますか?