в моем приложении, я создаю пользовательский 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, Планировщик обработчиков)