Dans mon application, je crée une personnalisation BroadcastReceiver
et je l'enregistre manuellement dans mon contexte via Context.registerReceiver
. J'ai aussi un AsyncTask
qui envoie les intentions de notification via Context.sendBroadcast
. Les intentions sont envoyées à partir d'un thread de travail non-UI, mais il semble que BroadcastReceiver.onReceive
(qui reçoit lesdites intentions) s'exécute toujours dans le thread de l'interface utilisateur (ce qui est bon pour moi). Est-ce garanti ou ne devrais-je pas me fier à cela?
android
broadcastreceiver
Hannes Struß
la source
la source
onCreate()
,onReceive()
) sont appelés sur le fil de l' application principale. Et, il est documenté dans la documentation pouronReceive()
: goo.gl/8kPuHonReceive()
est appelé sur un thread autre que le thread de l'application principale ("UI").Puisque vous enregistrez dynamiquement le récepteur, vous pouvez spécifier qu'un autre thread (autre que le thread d'interface utilisateur) gère le
onReceive()
. Cela se fait via le paramètre Handler de registerReceiver () .Cela dit, si vous n'avez pas spécifié d'autre gestionnaire, il sera toujours géré sur le thread d'interface utilisateur.
la source
Habituellement, tout dépend de la manière dont vous l'enregistrez.
Si vous enregistrez votre
BroadcastReceiver
utilisation:Il s'exécutera dans le thread d'activité principal (aka thread UI) .
Si vous enregistrez votre en
BroadcastReceiver
utilisant uneHandler
exécution valide sur un autre thread :Il fonctionnera dans le contexte de votre
Handler
Par exemple:
Détails ici et ici .
la source
Comme les réponses précédentes correctement énoncées
onReceive
seront exécutées sur le thread avecregisterReceiver()
lequel il est enregistré si la saveur de cela accepte un gestionnaire est appelé - sinon sur le thread principal.Sauf si le récepteur est enregistré auprès de
LocalBroadcastManager
et que la diffusion se fait viasendBroadcastSync
- où il fonctionnera apparemment sur le thread qui appellesendBroadcastSync.
la source
and the broadcast is via sendBroadcastSync
. Lorsque nous utilisonsLocalBroadcastManager
pour enregistrer le récepteur, il doit être appelé par le thread principal, que ce soit usesendBroadcastSync
ousendBroadcast
. Donc, la clé est d'utiliserLocalBroadcastManager
pour vous inscrire. Ai-je raison?OUI Context.registerReceiver (récepteur BroadcastReceiver, filtre IntentFilter, String broadcastPermission, planificateur de gestionnaire)
la source