web-dev-qa-db-fra.com

Android - Comment désinscrire un récepteur créé dans le manifeste?

Je connais l'utilisation de registerReceiver et d'unregisterReceiver en code Java pour traiter les destinataires, mais supposons que mon manifeste contient les éléments suivants:

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

Est-il possible de désenregistrer cet élément quelque part dans le code Java? Pourrais-je lui attribuer un attribut id ou quelque chose puis l'obtenir et le désenregistrer? Je demande parce que je veux que mon application ne fasse quelque chose que la première fois que cette action se produit, puis la désenregistre et la réenregistre plus tard en Java.

J'espère que j'ai bien expliqué cela, merci pour toute aide.

38
JDS

Vous pouvez utiliser la PackageManager pour activer/désactiver une BroadcastReceiver dans déclarée dans le manifeste. Le Broadcast Receiver ne sera déclenché que s'il est activé.

Utilisez ceci pour créer un composant

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

Vérifier si le composant est activé ou désactivé 

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");
}

Activer/Désactiver le composant (Récepteur de diffusion dans votre cas)

//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);
86
Varun

Sur la base de la réponse de Varun, j'ai créé cette méthode utilitaire

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