No meu aplicativo, eu crio um custom BroadcastReceiver
e o registro no meu Context manualmente via Context.registerReceiver
. Eu também tenho um AsyncTask
que despacha Intents notifier via Context.sendBroadcast
. Os intents são enviados de um thread de trabalho não-UI, mas parece que BroadcastReceiver.onReceive
(que recebe os referidos Intents) sempre é executado no thread de UI (o que é bom para mim). Isso é garantido ou não devo confiar nisso?
android
broadcastreceiver
Hannes Struß
fonte
fonte
onCreate()
,onReceive()
) são chamados no segmento do aplicativo principal. E, está documentado nos documentos deonReceive()
: goo.gl/8kPuHonReceive()
seja chamado em um thread diferente do thread do aplicativo principal ("UI").Visto que você registra dinamicamente o receptor, você pode especificar que outro thread (diferente do UI thread) manipule o
onReceive()
. Isso é feito por meio do parâmetro Handler de registerReceiver () .Dito isso, se você não especificou outro Handler, ele sempre será tratado no thread de UI.
fonte
Normalmente, tudo depende de como você o registra.
Se você registrar seu
BroadcastReceiver
usando:Ele será executado no thread de atividade principal (também conhecido como thread de interface do usuário) .
Se você registrar seu
BroadcastReceiver
usando umaHandler
execução válida em um thread diferente :Ele será executado no contexto do seu
Handler
Por exemplo:
Detalhes aqui e aqui .
fonte
Como as respostas anteriores indicadas corretamente,
onReceive
serão executadas no tópico com o qual está registrado se o sabor deregisterReceiver()
que aceita um manipulador for chamado - caso contrário, no tópico principal.Exceto se o receptor estiver registrado no
LocalBroadcastManager
e a transmissão for viasendBroadcastSync
- onde aparentemente será executado no thread que chamasendBroadcastSync.
fonte
and the broadcast is via sendBroadcastSync
. Quando usamosLocalBroadcastManager
para registrar o receptor, ele deve ser chamado por thread principal se usarsendBroadcastSync
ousendBroadcast
. Portanto, a chave é usarLocalBroadcastManager
para se registrar. Estou certo?YES Context.registerReceiver (receptor BroadcastReceiver, filtro IntentFilter, String broadcastPermission, agendador de manipulador)
fonte