在我的应用中,我创建了一个自定义BroadcastReceiver
并通过Context.registerReceiver
手动将其注册到我的上下文。我还有AsyncTask
通过Context.sendBroadcast
调度notifier-Intents。意图是从非UI工作线程发送的,但似乎BroadcastReceiver.onReceive
(接收所述Intents)总是在UI线程中运行(这对我有好处)。这是保证还是我不应该依赖它?
答案 0 :(得分:146)
BroadcastReceiver.onReceive是否始终在UI线程中运行?
是
答案 1 :(得分:73)
由于您动态注册接收器,您可以指定另一个线程(UI线程除外)处理onReceive()
。这是通过registerReceiver()的Handler参数完成的。
也就是说,如果你没有指定另一个Handler,它将始终在UI线程上处理。
答案 2 :(得分:59)
BroadcastReceiver.onReceive是否始终在UI线程中运行?
通常,这取决于您如何注册。
如果您使用以下注册BroadcastReceiver
:
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
它将在 主要活动线程(又名UI线程) 中运行。
如果您使用在其他主题上运行的有效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 :(得分:9)
如前面的答案正确陈述onReceive
将在其注册的线程上运行,如果调用接受处理程序的registerReceiver()
的味道 - 否则在主线程上。
除非接收方已在LocalBroadcastManager
注册且广播是通过sendBroadcastSync
,否则它将apparently在调用sendBroadcastSync.
的线程上运行
答案 4 :(得分:0)
YES Context.registerReceiver(BroadcastReceiver接收器, IntentFilter过滤器, 字符串broadcastPermission, 处理程序调度程序)