BroadcastReceiver.onReceive是否总是在UI线程中运行?
在我的应用程序中,我创build了一个自定义的BroadcastReceiver
并通过Context.registerReceiver
手动将其注册到我的Context。 我也有一个AsyncTask
通过Context.sendBroadcast
调度notifier-intents。 意图是从一个非UI工作者线程发送的,但是似乎BroadcastReceiver.onReceive
(它接收到这个Intents)总是在UI线程中运行(这对我来说很好)。 这是保证,还是我不应该依靠?
BroadcastReceiver.onReceive是否总是在UI线程中运行?
是。
由于您dynamic注册接收器,您可以指定另一个线程(UI线程除外)处理onReceive()
。 这是通过registerReceiver()的Handler参数完成的。
也就是说,如果你没有指定另一个处理程序,它将永远在UI线程上处理。
BroadcastReceiver.onReceive是否总是在UI线程中运行?
通常,这一切都取决于你如何注册它。
如果您使用以下方式注册您的BroadcastReceiver
:
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
它将运行在主要活动线程(又名UI线程)中 。
如果您使用在另一个线程上运行的有效Handler
注册您的BroadcastReceiver
:
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
详情在这里 & 这里 。
正如前面的答案正确地说onReceive
将运行在它注册的线程上,如果接受一个处理程序的registerReceiver()
的风格被调用 – 否则在主线程上。
除非接收方是使用LocalBroadcastManager
注册的,而广播是通过sendBroadcastSync
– 它显然会在调用sendBroadcastSync.
的线程上运行sendBroadcastSync.
YES Context.registerReceiver(BroadcastReceiver接收器,IntentFilterfilter,String broadcastPermission,Handler调度器)