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);
}
}
3 Réponses :
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); }
Cependant, b>, j'ai toujours un problème. Après avoir appelé l'appel à enregistrer le récepteur, dès que j'appelle finition (); code> 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 (); Code> .. Comment puis-je éviter cela, tout en fermant la fenêtre d'activité actuelle?
J'ai réussi à résoudre mon problème en ajoutant des entrées de terrain pour statique Broadcastreceiver myReceiver en l'affectant, puis en l'affectant comme
myReceiver = ... code> à 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 (); Code> simplement en remplaçant
Context.registerrecefeiver Code> avec
context.getapplicationContext.registerreceiver < / code>. Problème (s) résolu (s)! P>
Vous pouvez encapsuler le processus en faisant 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> 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>.
class TestActivity extends Activity{
private GpsRecieverHelper helper = new GpsRecieverHelper();
public void onStart(){
helper.receiverRegister(this);
}
public void onStop(){
helper.receiverUnregister(this);
}
}