Activer et désactiver un récepteur de diffusion

J’essaie d’activer et de désactiver un récepteur de diffusion en utilisant cette méthode PackageManager:

setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

Le récepteur de diffusion est enregistré dans le manifeste. Le récepteur fonctionne correctement, mais lorsque je tente de le désactiver, il reçoit toujours les messages de diffusion. Lorsque je désactive le récepteur dans le manifeste par “android: enabled =” false “”, le récepteur ne reçoit rien mais je ne peux pas l’activer.

J’appelle la méthode depuis l’intérieur d’un service.

  PackageManager pm = getApplicationContext().getPackageManager(); ComponentName componentName = new ComponentName("com.app", ".broadcast_receivers.OnNetworkChangedReceiver"); pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 

Manifeste Android:

       

Le récepteur

 public class OnNetworkChangedReceiver extends BroadcastReceiver { private static final Ssortingng TAG = "OnNetworkChangedReceiver"; @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "in OnNetworkChanged"); } } 

J’ai aussi appelé la méthode depuis l’intérieur d’une activité hier. Je pensais que cela fonctionnait mais aujourd’hui rien ne fonctionne plus. Se pourrait-il qu’il y ait parfois un grand retard dans l’intention (android.net.conn.CONNECTIVITY_CHANGE) que j’ai mal interprété hier en désactivant le récepteur?

L’approche avec le gestionnaire de package est-elle la bonne direction ou existe-t-il une erreur de base dans l’idée?

Merci beaucoup, Sven

Eh bien, ce que vous avez fondamentalement semble correct. J’ai le code suivant dans l’ un de mes projets :

 boolean enabled=prefs.getBoolean(key, false); int flag=(enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : PackageManager.COMPONENT_ENABLED_STATE_DISABLED); ComponentName component=new ComponentName(EditPreferences.this, OnBootReceiver.class); getPackageManager() .setComponentEnabledSetting(component, flag, PackageManager.DONT_KILL_APP); 

Je l’utilise pour désactiver un récepteur BOOT_COMPLETED lorsque je n’ai aucune alarme active à programmer.

Je suppose que votre ComponentName n’est pas configuré correctement (par exemple, votre leader). Essayez le constructeur que j’utilise, qui prend un Context et une Class comme parameters.

Je pense que l’utilisation du PackageManager est en train de repenser votre situation. Vous avez un BroadcastReceiver qui doit parfois ignorer les émissions qu’il écoute. Je peux penser à deux manières faciles d’y parvenir:

1) Définissez un indicateur que votre récepteur peut vérifier pour ignorer ou accepter les diffusions et ne vous souciez pas de l’activer ou de le désactiver.

2) Créez le BroadcastReceiver par programmation (peut-être même une classe interne), puis enregistrez-le et désinscrivez-le selon vos besoins sur certaines parties de votre application.

En général, j’ai trouvé que la définition de mes BroadcastReceivers en code au lieu de XML a apporté beaucoup plus de flexibilité et est généralement plus facile à gérer.