J'aimerais savoir quelle est la meilleure pratique / manière d'enregistrer par programmation un récepteur de diffusion. Je souhaite enregistrer des récepteurs spécifiques selon le choix de l'utilisateur.
Comme l'enregistrement se fait via le fichier manifeste, je me demande s'il existe un moyen approprié d'y parvenir dans le code.
android
broadcastreceiver
CoolStraw
la source
la source
Réponses:
Il semble que vous souhaitiez contrôler si les composants publiés dans votre manifeste sont actifs, et non enregistrer dynamiquement un récepteur (via Context.registerReceiver ()) lors de l'exécution.
Si tel est le cas, vous pouvez utiliser PackageManager.setComponentEnabledSetting () pour contrôler si ces composants sont actifs:
http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName, int, int)
Notez que si vous souhaitez uniquement recevoir une diffusion pendant que vous exécutez, il est préférable d'utiliser registerReceiver (). Un composant récepteur est principalement utile lorsque vous devez vous assurer que votre application est lancée à chaque fois que la diffusion est envoyée.
la source
Dans votre
onCreate
méthode, vous pouvez enregistrer un récepteur comme ceci:N'oubliez pas d'exécuter ceci dans la
onDestroy
méthode:la source
onDestroy()
sera appelé, créant ainsi une fuite de mémoire potentielle. Il est préférable de s'inscrire / se désinscrire dansonStart()
/onStop()
.Un point important que les gens oublient de mentionner est la durée de vie du
Broadcast Receiver
. La différence entre son enregistrement par programme et son enregistrement dans AndroidManifest.xml est la suivante. Dans le fichier manifeste, cela ne dépend pas de la durée de vie de l'application. Lors de son enregistrement par programme, cela dépend de la durée de vie de l'application. Cela signifie que si vous vous inscrivez dans AndroidManifest.xml , vous pouvez capturer les intentions diffusées même lorsque votre application n'est pas en cours d'exécution.Edit: La note mentionnée n'est plus vraie à partir d'Android 3.1, le système Android exclut tous les récepteurs de recevoir des intentions par défaut si l'application correspondante n'a jamais été démarrée par l'utilisateur ou si l'utilisateur a explicitement arrêté l'application via le menu Android (dans Gérer → Application). https://developer.android.com/about/versions/android-3.1.html
Il s'agit d'une fonction de sécurité supplémentaire car l'utilisateur peut être sûr que seules les applications qu'il a démarrées recevront des intentions de diffusion.
On peut donc comprendre que les récepteurs enregistrés par programme dans l'application
onCreate()
auraient le même effet que ceux déclarés dans AndroidManifest.xml à partir d'Android 3.1 ci-dessus.la source
Définissez un récepteur de diffusion n'importe où dans Activité / Fragment comme ceci:
Définir IntentFilter dans
onCreate()
Enregistrez maintenant le BroadcastReciever dans
onResume()
et désenregistrez-le dansonPause()
[car il n'y a aucune utilisation de diffusion si l'activité est interrompue].Pour un didacticiel détaillé, jetez un œil aux deux façons de mettre en œuvre le récepteur de diffusion .
la source
la source
Selon Écouter et diffuser des messages globaux, définir des alarmes dans les tâches courantes et comment les faire sous Android :
Jetez un œil à registerReceiver (récepteur BroadcastReceiver, filtre IntentFilter) pour plus d'informations.
la source
context.registerReceiver
mais il n'est pas appelé, pouvez-vous s'il vous plaît regarder cette question stackoverflow.com/questions/13238600/…Il est recommandé de toujours fournir l'autorisation lors de l'enregistrement du récepteur, sinon vous recevrez pour toute application qui envoie une intention correspondante. Cela peut permettre à des applications malveillantes de diffuser sur votre récepteur.
la source
pour LocalBroadcastManager
et inscrivez-vous
onResume
et désenregistrer
onStop
et recevez-le ..
où IntentFilter est
la source
Deux choix
registerReceiver(...
) dansonStart()
etunregisterReceiver(...)
dansonStop()
registerReceiver(...)
dansonCreate(...)
etunregisterReceiver(...)
dansonDestroy()
Prime:
Si vous ne voulez pas écrire de code standard pour enregistrer et désenregistrer un BroadcastReceiver encore et encore dans chaque activité, alors,
Voici l'extrait de code:
Voir le code complet:
ICI
la source
Créer un récepteur de diffusion
[BroadcastReceiver (Enabled = true, Exported = false)]
Depuis votre activité, ajoutez ce code:
la source