Android的BroadcastReceivers是否在新线程中启动?

如果我有一个在我的Service类中扩展BroadcastReceiver内部类,那么当BroadcastReceiver类从Service类读取/写入对象时,我应该关心同步吗? 或者BroadacstReceiver一种说法: BroadacstReceiveronReceive()方法是否在一个额外的线程中启动?

Solutions Collecting From Web of "Android的BroadcastReceivers是否在新线程中启动?"

onReceive()方法总是在主线程(也称为“UI线程”)上调用,除非您使用registerReceiver()变体请求将其安排在不同的线程上:

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

Android的BroadcastReceivers是否在新线程中启动?

通常,这一切都取决于你如何注册它。

如果您使用以下方式注册您的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()方法在主线程上被调用。 所以,如果您对服务类的所有访问都是在主线程中完成的,则不需要任何同步。

此外,您可以在AndroidManifest.xml中指定“android:process”接收器元素属性。 看到这里 。 这样你可以指定接收器作为一个单独的进程运行,而不是绑定到主UI线程。