Если у меня есть внутренний класс, который расширяет BroadcastReceiver
в моем классе Service
, должен ли я заботиться о синхронизации, когда класс BroadcastReceiver
читает/записывает объекты из класса Service
?
Или по-другому: Существуют ли BroadacstReceiver
onReceive()
методы, запущенные в дополнительном потоке?
Появляются ли Android BroadcastReceivers в новом потоке?
Ответ 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
Ответ 3
Метод onReceive() вызывается в основном потоке. Итак, в случае, если весь ваш доступ к классу службы выполняется из основного потока, вы не Синхронизация не требуется.
Ответ 4
Кроме того, вы можете указать атрибут элемента приемника "android: process" в AndroidManifest.xml. См. здесь. Таким образом, вы можете указать, что приемник работает как отдельный процесс и не привязан к основному потоку пользовательского интерфейса.