0
votes

Android - Enregistrement / Désenregister Dynamiquement l'utilisation d'une classe d'assistance avec des méthodes statiques?

la situation: strong>

J'ai une classe "assistant" avec des méthodes statiques, pour activer / désactiver de manière dynamique une radiodiffusion.
J'appelle ces méthodes d'autres classes, lorsque je dois m'inscrire (ou) désenregistrer le récepteur.
de
le problème: strong>
Je ne peux pas comprendre comment enregistrer dynamiquement un fort> enregistrer le récepteur de la classe d'assistance ..
(Quand j'essaie de faire context.unregisterRecefeiver (myReceiver); code> il ne reconnaît pas myReceiver code>).
de
la question: strong>
Comment faire correctement référence myRecefeiver code> à partir de la méthode code> réceptivunregister code> dans le code ci-dessous?


public class GpsReceiverHelper {


    //  Called from a different Class when I need to Register the Receiver
    public static void receiverRegister(Context context) {

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.location.PROVIDERS_CHANGED");

        final BroadcastReceiver myReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //  Receiver code goes here    
            }
        };
        context.registerReceiver(myReceiver, intentFilter);
    }



    //  Called from a different Class when I need to UN-Register the Receiver
    public static void receiverUnregister(Context context) {

        //  THIS DOESN'T WORK BECAUSE "myReceiver" can't be found..
        context.unregisterReceiver(myReceiver);

    }


}


0 commentaires

3 Réponses :


1
votes

Vous devez garder des références à tous les récepteurs que vous vous enregistrez. Vous pouvez le faire de différentes manières. Une solution est d'avoir une collection statique qui les détient dans cette classe d'assistance (pas la meilleure approche). Une autre façon consiste à renvoyer le récepteur dans votre méthode code> récepteur code>. De cette façon, quiconque appelle la méthode doit conserver la référence et ultérieurement de l'utiliser pour désenregistrer.

public BroadcastReceiver registerReceiver(...) {
  ...
  return receiver;
}

public void unregisterReceiver(Context context, BroadcastReceiver receiver) {
  context.unregisterReceiver(receiver);
}


1 commentaires

Cependant, , j'ai toujours un problème. Après avoir appelé l'appel à enregistrer le récepteur, dès que j'appelle finition (); pour fermer la fenêtre d'activité (donc Le BroadCastraVeiver peut rester en panne en arrière-plan), il tue le BroadCastraCeiver immédiatement après l'appelant Terminer (); .. Comment puis-je éviter cela, tout en fermant la fenêtre d'activité actuelle?



0
votes

J'ai réussi à résoudre mon problème en ajoutant des entrées de terrain pour statique Broadcastreceiver myReceiver myReceiver = ... à l'intérieur de ma méthode statique contenant le radiodiqueur réel Code .. En outre, j'ai réalisé que je pouvais éviter que le Broadcastructeur soit tué lors de l'appelant Terminer (); simplement en remplaçant Context.registerrecefeiver avec context.getapplicationContext.registerreceiver < / code>. Problème (s) résolu (s)!


0 commentaires

0
votes

Vous pouvez encapsuler le processus en faisant inentfilter code> en tant que membre de GPSReceiverhelper CODE> Classe et en supprimant essentiellement le mot-clé code> code> de Recieverregister code> et reçusRunregister code>. xxx pré>

Le code ci-dessus est maintenant une classe d'assistance réelle plutôt que d'une classe d'utilité avec un tas de méthodes statiques. P> Exemple d'utilisation: P>

class TestActivity extends Activity{
  private GpsRecieverHelper helper = new GpsRecieverHelper();

  public void onStart(){
      helper.receiverRegister(this);
  }

  public void onStop(){
      helper.receiverUnregister(this);
  }
}


0 commentaires