En mi aplicación, creo un personalizado BroadcastReceiver
y lo registro en mi contexto manualmente a través de Context.registerReceiver
. También tengo un AsyncTask
que envía notifier-Intents a través de Context.sendBroadcast
. Las intenciones se envían desde un hilo de trabajo que no es de la interfaz de usuario, pero parece que BroadcastReceiver.onReceive
(que recibe dichas intenciones) siempre se ejecuta en el hilo de la interfaz de usuario (lo cual es bueno para mí). ¿Está esto garantizado o no debo confiar en eso?
android
broadcastreceiver
Hannes Struß
fuente
fuente
onCreate()
,onReceive()
) se denominan en el hilo principal de la aplicación. Y está documentado en los documentos paraonReceive()
: goo.gl/8kPuHonReceive()
se llame a un hilo que no sea el hilo de la aplicación principal ("UI").Dado que registra dinámicamente el receptor, puede especificar que otro hilo (que no sea el hilo de la interfaz de usuario) maneje el
onReceive()
. Esto se hace a través del parámetro Handler de registerReceiver () .Dicho esto, si no especificó otro controlador, siempre se manejará en el hilo de la interfaz de usuario.
fuente
Por lo general, todo depende de cómo lo registre.
Si registra su
BroadcastReceiver
uso:Se ejecutará en el hilo de actividad principal (también conocido como hilo de UI) .
Si registra su
BroadcastReceiver
uso de unaHandler
ejecución válida en un hilo diferente :Se ejecutará en el contexto de su
Handler
Por ejemplo:
Detalles aquí y aquí .
fuente
Como se indicaron correctamente las respuestas anteriores,
onReceive
se ejecutará en el hilo con el que está registrado siregisterReceiver()
se llama al tipo de que acepta un controlador; de lo contrario, en el hilo principal.Excepto si el receptor está registrado con el
LocalBroadcastManager
y la transmisión es víasendBroadcastSync
, donde aparentemente se ejecutará en el hilo que llamasendBroadcastSync.
fuente
and the broadcast is via sendBroadcastSync
. Cuando usamosLocalBroadcastManager
para registrar el receptor, debe ser llamado por el hilo principal, ya sea que usesendBroadcastSync
osendBroadcast
. Entonces la clave es que useLocalBroadcastManager
para registrarse. Estoy en lo cierto?YES Context.registerReceiver (receptor BroadcastReceiver, filtro IntentFilter, String broadcastPermission, Handler planificador)
fuente