41 votes

Activer et désactiver un récepteur de diffusion

J'essaie d'activer et de désactiver un récepteur de radiodiffusion par l'utilisation de ce PackageManager méthode:

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

Le récepteur de radiodiffusion est inscrite dans le manifeste. Le récepteur fonctionne très bien mais lorsque j'essaie de le désactiver, il reçoit encore 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 à partir de 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);

Android manifest:

    <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 aussi appelé la méthode de l'intérieur d'une Activité d'hier. Je pensais que cela a fonctionné, mais aujourd'hui rien ne fonctionne plus. Se pourrait-il qu'il y a parfois un gros retard dans l'intention android.net.conn.CONNECTIVITY_CHANGE) que j'en ai mal interprété hier que la désactivation du récepteur?

Est l'approche avec le PackageManager la bonne direction ou est-il une erreur de base dans l'idée?

Merci beaucoup, Sven

74voto

CommonsWare Points 402670

Eh bien, ce que vous avez fondamentalement semble OK. J'ai le code suivant dans 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 BOOT_COMPLETED récepteur quand je n'ai pas toutes les alarmes actives qui doivent être prévues.

Ma conjecture est que votre ComponentName n'est pas correctement configuré (par exemple, votre menant .). Essayez le constructeur que j'utilise, qui prend un Context et Class en tant que paramètres.

3voto

LeffelMania Points 5484

Je pense à l'aide de la PackageManager est de plus en plus de penser à votre situation. Vous avez un BroadcastReceiver qui doit parfois ignorer les émissions, il est à l'écoute. Je ne peux penser à deux façons d'aller à ce sujet:

1) Définir un indicateur que votre récepteur peut vérifier à l'ignorer ou à accepter les diffusions, et ne vous inquiétez pas à propos de l'activation/la désactivation du tout.

2) Créer le BroadcastReceiver par programme (peut-être juste un intérieur de classe, même), et s'inscrire ou se désinscrire comme vous avez besoin à des parties de votre application.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X