web-dev-qa-db-ja.com

Android-マニフェストで作成されたレシーバーの登録を解除する方法?

Javaレシーバーを処理するためのコード)でregisterReceiverとunregisterReceiverを使用することは知っていますが、マニフェストに次のコードがあるとします。

    <receiver Android:name=".headsetHook">
        <intent-filter Android:priority="99999999999">
            <action Android:name="Android.intent.action.ACTION_HEADSET_PLUG" />
        </intent-filter>
    </receiver>

Java code?このアクションが初めて発生したときに、登録を解除し、後でJavaで再登録します。

私がそれを明確にしたといいのですが、助けてくれてありがとう。

40
JDS

PackageManagerを使用して、マニフェストで宣言されたBroadcastReceiverを有効/無効にすることができます。 Broadcast Receiverが有効な場合にのみ発生します。

これを使用してコンポーネントを作成します

ComponentName component = new ComponentName(context, MyReceiver.class);

コンポーネントが有効か無効かを確認します

int status = context.getPackageManager().getComponentEnabledSetting(component);
if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
    Log.d("receiver is enabled");
} else if(status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
    Log.d("receiver is disabled");
}

コンポーネントを有効/無効にします(あなたの場合はブロードキャストレシーバー)

//Disable
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP);
//Enable
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP);
89
Varun

Varunの回答に基づいて、私はこの実用的な方法を作成しました

private void unregisterReceiverFromManifest(Class<? extends BroadcastReceiver> clazz, final Context context) {
    final ComponentName component = new ComponentName(context, clazz);
    final int status = context.getPackageManager().getComponentEnabledSetting(component);
    if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
        context.getPackageManager()
                 .setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                     PackageManager.DONT_KILL_APP);
        }
    }
1
hzitoun