web-dev-qa-db-fra.com

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 bien mais quand j'essaie de le désactiver, il reçoit toujours les messages diffusés. 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:

    <receiver Android:name=".broadcast_receivers.OnNetworkChangedReceiver"
                Android:enabled="true">
            <intent-filter>
                    <action Android:name="Android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
    </receiver>

Le récepteur

public class OnNetworkChangedReceiver extends BroadcastReceiver {
private static final String TAG = "OnNetworkChangedReceiver";

@Override
public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "in OnNetworkChanged");
    }
}

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

L'approche avec le PackageManager est-elle la bonne direction ou y a-t-il une erreur de base dans l'idée?

Merci beaucoup, Sven

41
Sven

Eh bien, ce que vous avez semble fondamentalement OK. J'ai le code suivant dans n 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 . De tête). Essayez le constructeur que j'utilise, qui prend un Context et un Class comme paramètres.

73
CommonsWare

Je pense que l'utilisation du PackageManager fait trop penser à votre situation. Vous avez un BroadcastReceiver qui doit parfois ignorer les émissions qu'il écoute. Je peux penser à deux façons simples de procéder:

1) Définissez un indicateur que votre récepteur peut vérifier pour ignorer ou accepter les émissions, et ne vous inquiétez pas de l'activer/le désactiver.

2) Créez le BroadcastReceiver par programmation (peut être une classe interne, même), et enregistrez-le et annulez-le selon vos besoins dans des parties données de votre application.

En général, j'ai trouvé que la définition de mes BroadcastReceivers dans du code au lieu de XML a fourni beaucoup plus de flexibilité et est généralement plus facile à gérer pour moi.

4
LeffelMania