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

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

56316 次浏览

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

是的。

由于动态注册了接收方,因此可以指定另一个线程(UI 线程除外)处理 onReceive()。这是通过 registerReceiver()的 Handler 参数完成的。

That said, if you did not do specify another Handler, it will get handled on UI thread always.

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

通常,这完全取决于您如何注册它。

If you register your BroadcastReceiver using:

registerReceiver(BroadcastReceiver receiver, IntentFilter filter)

它将在 Main activity thread (aka UI thread) 主活动线程(又名 UI 线程)中运行。

如果您使用有效的 Handler 在另一个线程上运行注册您的 BroadcastReceiver:

registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)

它将在 < em > 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

详情 给你 & 给你

正如前面的答案所正确指出的,如果接受处理程序的 registerReceiver()的味道被调用,那么 onReceive将在它注册的线程上运行——否则在主线程上。

除非接收器是通过 LocalBroadcastManager注册的,并且广播是通过 sendBroadcastSync播放的——在那里它将在调用 sendBroadcastSync.的线程上运行 很明显