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>

その後、このレシーバーは 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 コンストラクターを見つけることができませんでした。アイデアが尽きた感じです。プログラムでプロセス名を設定する方法はありますか?

4

1 に答える 1

1

その後、このレシーバーは 1 つのアクティビティでのみ使用することに気付きました。そのため、アプリの起動時にインスタンス化する必要はなく、プログラムでコードで定義できます。

マニフェスト登録BroadcastReceiverは「アプリ起動時にインスタンス化」されません。一致するブロードキャストが送信されたときにのみインスタンス化されます。

しかし、コードからプロセスを設定する方法が見つかりません。

それは不可能だからです。その上、あなたはそれを必要とせず、RAM、CPU、およびバッテリーを浪費することでユーザーに害を及ぼします. 別のプロセスが必要な理由が完全かつ正確にandroid:processわかっていない限り、マニフェスト エントリに属性を含めるべきではありません。Android アプリの大部分はそうではありません。

于 2013-04-20T23:14:07.430 に答える