Подтвердить что ты не робот

Появляются ли Android BroadcastReceivers в новом потоке?

Если у меня есть внутренний класс, который расширяет BroadcastReceiver в моем классе Service, должен ли я заботиться о синхронизации, когда класс BroadcastReceiver читает/записывает объекты из класса Service? Или по-другому: Существуют ли BroadacstReceiver onReceive() методы, запущенные в дополнительном потоке?

4b9b3361

Ответ 1

Метод onReceive() всегда вызывается в основном потоке (который также упоминается как "поток пользовательского интерфейса" ), если только вы не запросили его планировать в другом потоке, используя вариант registerReceiver():

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

Ответ 2

Появляются ли Android BroadcastReceivers в новом потоке?

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

Если вы зарегистрируете свой 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

Кроме того, вы можете указать атрибут элемента приемника "android: process" в AndroidManifest.xml. См. здесь. Таким образом, вы можете указать, что приемник работает как отдельный процесс и не привязан к основному потоку пользовательского интерфейса.