Всегда ли BroadcastReceiver.onReceive работает в потоке пользовательского интерфейса? - программирование
Подтвердить что ты не робот

Всегда ли BroadcastReceiver.onReceive работает в потоке пользовательского интерфейса?

в моем приложении, я создаю пользовательский BroadcastReceiver и регистрирую его в своем Контексте вручную через Context.registerReceiver. У меня также есть AsyncTask, который отправляет notifier-Intents через Context.sendBroadcast. Намерения отправляются из рабочего потока, отличного от пользовательского интерфейса, но кажется, что BroadcastReceiver.onReceive (который получает упомянутые намерения) всегда работает в потоке пользовательского интерфейса (что хорошо для меня). Является ли это гарантией или я не должен полагаться на это?

4b9b3361

Ответ 1

Всегда ли работает BroadcastReceiver.onReceive в потоке пользовательского интерфейса?

Да.

Ответ 2

Поскольку вы динамически регистрируете ресивер, вы можете указать, что другой поток (кроме потока пользовательского интерфейса) обрабатывает onReceive(). Это делается с помощью параметра Handler registerReceiver().

Тем не менее, если вы не указали другого обработчика, он всегда будет обрабатываться в потоке пользовательского интерфейса.

Ответ 3

Всегда ли работает BroadcastReceiver.onReceive в потоке пользовательского интерфейса?

Обычно все зависит от того, как вы его зарегистрировали.

Если вы зарегистрируете свой BroadcastReceiver, используя:

registerReceiver(BroadcastReceiver receiver, IntentFilter filter)

Он будет запускаться в основном потоке активности (также как поток пользовательского интерфейса).

Если вы зарегистрируете свой BroadcastReceiver, используя действительный Handler , запущенный в другом потоке:

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

Он будет работать в контексте вашего Handler

Например:

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

Подробнее здесь и здесь.

Ответ 4

Как сказано в предыдущих ответах, onReceive будет запускаться в потоке, который он зарегистрировал, если аромат registerReceiver(), который принимает обработчик называется - иначе в основном потоке.

За исключением случаев, когда приемник зарегистрирован с помощью LocalBroadcastManager, а трансляция осуществляется через sendBroadcastSync - где он будет явно запускаться в потоке, который вызывает sendBroadcastSync.

Ответ 5

ДА Context.registerReceiver(приемник BroadcastReceiver,                        Фильтр IntentFilter,                        String broadcastPermission,                        Планировщик обработчиков)