9
votes

Enregistrement de manière dynamique / désinscrire un récepteur de diffusion dans Android

Je veux vous enregistrer de manière dynamique et désinscrire ma classe de récepteur avec la diffusion: "android.net.wifi.state_change" Cela fonctionne très bien si je le fais dans le manifeste. Mais cela le rend statique. Je veux le faire de manière dynamique dans la classe d'activité. Quelle est sa commande correspondante dans la classe d'activité?

C'est ce que mon code est ... Et je passe un problème à cause de l'enregistrement et de l'enregistrement (plusieurs fois) mon récepteur (qui commence un service). P>

public class startScreen extends Activity {
    /** Called when the activity is first created. */

    private BroadcastReceiver receiver = new BroadcastReceiver() {    

        @Override
        public void onReceive(Context context, Intent intent) {
            Intent serviceIntent = new Intent();
            serviceIntent.setAction("com.example.MyService");
            context.startService(serviceIntent);    
        }    
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.initial);

        final IntentFilter filter = new IntentFilter();
        filter.addAction("android.net.wifi.STATE_CHANGE");   

        Button button = (Button) findViewById(R.id.button1);
        final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton1);

        try {
                ...some code...
            if (bool == true) {
                toggleButton.setChecked(true);
                this.registerReceiver(receiver, filter);
            } else
                toggleButton.setChecked(false);
        } catch (Exception e) {
            Log.e("Error", "Database", e);
        } finally {
                ...
        }

        toggleButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                if ((toggleButton.isChecked())) {
                    getBaseContext().registerReceiver(receiver, filter);

                } else {
                    if (receiver != null) {
                        getBaseContext().unregisterReceiver(receiver);
                        receiver = null;
                    }

                }
            }
        });
    }    

    @Override
    protected void onResume() {
        super.onResume();
        if (bool == true) {
            if (receiver == null)
                this.registerReceiver(receiver, filter);
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (receiver != null) {
            this.unregisterReceiver(receiver);
            receiver = null;
        }
    }
}


5 Réponses :



11
votes

La classe LocalBroadcastManager est utilisée pour s'inscrire et envoyer des émissions d'intention d'objets locaux dans votre processus. Ceci est plus rapide et plus sûr car vos événements ne laissent pas votre application.

L'exemple suivant montre une activité qui enregistre pour un événement client appelé mon événement. xxx


0 commentaires

-2
votes
public void registerBroadcastReceiver(View view) {

    this.registerReceiver(broadCastReceiver, new IntentFilter(
        "android.intent.action.TIME_TICK"));
}


public void unregisterBroadcastReceiver(View view) {

    this.unregisterReceiver(broadCastReceiver);
}

2 commentaires

Broadcastructeur est un nom de votre radiodifférieur.


Pouvez-vous expliquer un peu?



0
votes

Peut-être que je suis un peu trop tard, mais le problème réside sur le fait que vous définissez le récepteur = null dans votre oncéause méthode, puis ne définissez jamais encore. Vous essayez également de l'enregistrer dans votre méthode ontresume , mais uniquement si c'est null , ce qui n'a aucun sens.

Vous devez modifier la logique où vous définissez / tester la valeur null du récepteur, pour simplement utiliser une variable booléen pour garder une trace de l'état du récepteur (si C'est inscrit ou non).


0 commentaires

3
votes

N'ajoutez pas de récepteur de diffusion dynamique dans OneReceive sur le fichier de diffusion. Ajoutez-le sur la première activité ou l'activité principale de votre application. Si vous n'aviez besoin que lorsque votre application est ouverte. Mais si vous en avez besoin, la réponse a toujours reçu une réponse, il suffit de l'ajouter sur le fichier manifeste

enregistrez le récepteur de diffusion dynamique sur l'activité principale h2> xxx pré>

désenregistrer ce récepteur de diffusion sur l'activité d'activité ou fermé H2>
@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(reciver);
}


0 commentaires