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 :
Utilisez les méthodes ci-dessous pour vous inscrire / interranger votre récepteur:
registerReceiver(BroadcastReceiver receiver, new IntentFilter("android.net.wifi.STATE_CHANGE")); unregisterReceiver(BroadcastReceiver receiver);
Merci beaucoup pour votre réponse ... mais cela ne semble pas fonctionner correctement (par rapport à la version statique [manifeste]). Il ne détecte pas le changement de l'état WiFi!
J'ai vu que la variable "récepteur" devient NULL après quelques commandes RegisterRecefeiver et nonregisterreceiver ... Plus précisément, après que je m'inscrivais et enregistrez à nouveau le récepteur, le récepteur n'a que NULL, et donc, tout en l'enregistrant à nouveau, donne une erreur!
Un objet BroadCastraCeiver n'est valable que pour la durée de l'appel à Onreceive (contexte, intention). Une fois que votre code revient de cette fonction, le système considère que l'objet est terminé et n'est plus actif. Pour vous enregistrer dynamiquement / désinscription de BroadCastraçeux, vous devez vous rappeler de désenregistrer l'instance de votre récepteur à l'autre () pour l'enregistrer à nouveau pendant l'ONRESUME (). Voici un Exemple d'application
Pls vérifier ma réponse ... Je l'ai mis comme une réponse séparée depuis que je ne pouvais pas mettre tout le code ici ici ... Je dépasserais le mot limite ici ...
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. P>
public void registerBroadcastReceiver(View view) { this.registerReceiver(broadCastReceiver, new IntentFilter( "android.intent.action.TIME_TICK")); } public void unregisterBroadcastReceiver(View view) { this.unregisterReceiver(broadCastReceiver); }
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 Vous devez modifier la logique où vous définissez / tester la valeur = null code> dans votre
oncéause code> méthode, puis ne définissez jamais encore. Vous essayez également de l'enregistrer dans votre méthode
ontresume code>, mais uniquement si c'est
null code>, ce qui n'a aucun sens. P>
null code> du récepteur, pour simplement utiliser une variable
booléen code> pour garder une trace de l'état du récepteur (si C'est inscrit ou non). P>
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
@Override protected void onStop() { super.onStop(); unregisterReceiver(reciver); }
Vérifiez Ce et Ceci out, similaire à ce que vous voulez réaliser. J'espère que cela t'aides.
Référez-vous http://stackoverflow.com/questions/4794776/Start-Broadcastre CEIVER-DE-ACTIVITÉ a>
Quel est le "problème" que vous avez? Indiquant que vous avez un problème sans dire ce qu'il est rarement utile pour ceux qui tentent de répondre à votre question. Obtenez-vous un message d'erreur? Quel est le libellé exact du message d'erreur et sur quelle ligne de code l'obtenez-vous?
Je suis désolé, je pense que je sterne le problème à laquelle je suis confronté ... Quoi qu'il en soit, le problème est que: J'ai vu que la variable "Récepteur" devient NULL après avoir exécuté une fois exécutant RegisterRecefeiver et des commandes sansregisterreceiver ... Plus précisément, après mon inscription et Unregister puis inscrivez-vous à nouveau le récepteur, le récepteur n'a que NULL, et donc, tout en la désenregistrant à nouveau, cela donne une erreur! Donc, fondamentalement, mon application n'est pas capable d'enregistrer un récepteur après la désenregistrement une fois. Pourquoi c'est un problème?