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

En mi aplicación, puedo crear un BroadcastReceiver personalizado y registrarlo en mi contexto manualmente a través de Context.registerReceiver . También tengo un AsyncTask que envía notificador-Intents vía Context.sendBroadcast . Las intenciones son enviadas desde un hilo de trabajo de usuario no-UI, pero parece que BroadcastReceiver.onReceive (que recibe dicho Intents) siempre se ejecuta en el hilo UI (lo cual es bueno para mí). ¿Está esto garantizado o no debo confiar en eso?

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

Sí.

Dado que usted registra dinámicamente el receptor, puede especificar que otro subproceso (que no sea el subproceso de 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, se manejará siempre en el subproceso de la interfaz de usuario.

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

Por lo general, todo depende de cómo registrarlo.

Si registra su BroadcastReceiver utilizando:

 registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 

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

Si registra su BroadcastReceiver utilizando un controlador válido que se ejecuta en un subproceso 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 correctamente declarado onReceive se ejecutará en el hilo que está registrado con si el sabor de registerReceiver() que acepta un controlador se llama – de lo contrario en el hilo principal.

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

YES Context.registerReceiver (receptor BroadcastReceiver, filtro IntentFilter, broadcastPermission de cadenas, planificador de Handler)

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.