BroadcastReceiver.onReceive是否总是在UI线程中运行?

时间:2011-04-15 09:00:28

标签: android

在我的应用中,我创建了一个自定义BroadcastReceiver并通过Context.registerReceiver手动将其注册到我的上下文。我还有AsyncTask通过Context.sendBroadcast调度notifier-Intents。意图是从非UI工作线程发送的,但似乎BroadcastReceiver.onReceive(接收所述Intents)总是在UI线程中运行(这对我有好处)。这是保证还是我不应该依赖它?

5 个答案:

答案 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

详情here& here

答案 3 :(得分:9)

如前面的答案正确陈述onReceive将在其注册的线程上运行,如果调用接受处理程序的registerReceiver()的味道 - 否则在主线程上。

除非接收方已在LocalBroadcastManager注册且广播是通过sendBroadcastSync,否则它将apparently在调用sendBroadcastSync.的线程上运行

答案 4 :(得分:0)

YES Context.registerReceiver(BroadcastReceiver接收器,                          IntentFilter过滤器,                          字符串broadcastPermission,                          处理程序调度程序)