En mi aplicación, creo un personalizado BroadcastReceivery lo registro en mi contexto manualmente a través de Context.registerReceiver. También tengo un AsyncTaskque 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
BroadcastReceiveruso:Se ejecutará en el hilo de actividad principal (también conocido como hilo de UI) .
Si registra su
BroadcastReceiveruso de unaHandlerejecución válida en un hilo diferente :Se ejecutará en el contexto de su
HandlerPor ejemplo:
Detalles aquí y aquí .
fuente
Como se indicaron correctamente las respuestas anteriores,
onReceivese 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
LocalBroadcastManagery la transmisión es víasendBroadcastSync, donde aparentemente se ejecutará en el hilo que llamasendBroadcastSync.fuente
and the broadcast is via sendBroadcastSync. Cuando usamosLocalBroadcastManagerpara registrar el receptor, debe ser llamado por el hilo principal, ya sea que usesendBroadcastSyncosendBroadcast. Entonces la clave es que useLocalBroadcastManagerpara registrarse. Estoy en lo cierto?YES Context.registerReceiver (receptor BroadcastReceiver, filtro IntentFilter, String broadcastPermission, Handler planificador)
fuente