¿BroadcastReceiver.onReceive siempre se ejecuta en el subproceso de interfaz de usuario?

en mi aplicación, creo un BroadcastReceiver personalizado y lo registro en mi contexto manualmente a través de Context.registerReceiver . También tengo un AsyncTask que despacha notifiers-Intents a través de Context.sendBroadcast . Los bashs se envían desde un hilo de trabajo que no es UI, pero parece que BroadcastReceiver.onReceive (que recibe dichos Intents) siempre se ejecuta en el hilo de UI (que es bueno para mí). ¿Esto está garantizado o no debería confiar en eso?

¿BroadcastReceiver.onReceive siempre se ejecuta en el subproceso de interfaz de usuario?

Sí.

Como usted registra dinámicamente el receptor, puede especificar que otro hilo (que no sea el del UI) maneje el onReceive() . Esto se hace a través del parámetro Handler de registerReceiver () .

Dicho esto, si no especificó otro controlador, se manejará siempre en el hilo de la interfaz de usuario.

¿BroadcastReceiver.onReceive siempre se ejecuta en el subproceso de interfaz de usuario?

Generalmente, todo depende de cómo lo registras.

Si registra su BroadcastReceiver usando:

 registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 

Se ejecutará en el hilo de actividad principal (también conocido como subproceso de interfaz de usuario) .

Si registra su BroadcastReceiver utilizando un Handler válido que se ejecuta en un hilo diferente :

 registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler) 

Se ejecutará en el contexto de su Handler

Por ejemplo:

 HandlerThread handlerThread = new HandlerThread("ht"); handlerThread.start(); Looper looper = handlerThread.getLooper(); Handler handler = new Handler(looper); context.registerReceiver(receiver, filter, null, handler); // Will not run on main thread 

Detalles aquí y aquí .

Como las respuestas anteriores indicadas correctamente en onReceive se ejecutarán en el hilo con el que está registrado si se llama el sabor de registerReceiver() que acepta un controlador, de lo contrario, en el hilo principal.

Excepto si el receptor está registrado con LocalBroadcastManager y la transmisión es a través de sendBroadcastSync , donde aparentemente se ejecutará en el hilo que llama a sendBroadcastSync.

SÍ Context.registerReceiver (receptor BroadcastReceiver, filtro IntentFilter, String broadcastPermission, progtwigdor Handler)