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