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调度器)