В своем приложении я создаю заказ BroadcastReceiver
и регистрирую его в своем контексте вручную через Context.registerReceiver
. У меня также есть программа, AsyncTask
которая отправляет уведомления-намерения через Context.sendBroadcast
. Намерения отправляются из рабочего потока, не относящегося к пользовательскому интерфейсу, но кажется, что BroadcastReceiver.onReceive
(который получает указанные намерения) всегда выполняется в потоке пользовательского интерфейса (что хорошо для меня). Это гарантировано или мне не следует полагаться на это?
android
broadcastreceiver
Ханнес Штрусс
источник
источник
onCreate()
,onReceive()
) называется на главном потоке приложения. И это задокументировано в документации дляonReceive()
: goo.gl/8kPuHonReceive()
вызывается поток, отличный от потока основного приложения («UI»).Поскольку вы динамически регистрируете получатель, вы можете указать, что другой поток (кроме потока пользовательского интерфейса) обрабатывает
onReceive()
. Это делается с помощью параметра Handler функции registerReceiver () .Тем не менее, если вы не указали другой обработчик, он всегда будет обрабатываться в потоке пользовательского интерфейса.
источник
Обычно все зависит от того, как вы его регистрируете.
Если вы зарегистрируете свое
BroadcastReceiver
использование:Он будет работать в основном потоке активности (он же поток пользовательского интерфейса) .
Если вы зарегистрируете свой
BroadcastReceiver
действительныйHandler
запуск в другом потоке :Он будет работать в контексте вашего
Handler
Например:
Подробности здесь и здесь .
источник
Как правильно указано в предыдущих ответах, он
onReceive
будет работать в потоке, в котором он зарегистрирован, если вкусregisterReceiver()
вызывается , принимающий обработчик, в противном случае в основном потоке.За исключением случаев, когда получатель зарегистрирован в
LocalBroadcastManager
и трансляция осуществляется черезsendBroadcastSync
- где он, по- видимому, будет работать в потоке, который вызываетsendBroadcastSync.
источник
and the broadcast is via sendBroadcastSync
. Когда мы используемLocalBroadcastManager
для регистрации приемника, он должен вызываться основным потоком независимо от того, используется лиsendBroadcastSync
илиsendBroadcast
. Итак, ключ в том, чтобы использоватьLocalBroadcastManager
для регистрации. Я прав?ДА Context.registerReceiver (приемник BroadcastReceiver, фильтр IntentFilter, String broadcastPermission, планировщик обработчика)
источник