Answers:
BroadcastReceiver.onReceive是否始终在UI线程中运行?
是。
onCreate(),onReceive())被称为主应用程序线程上。并且,它在以下文档的文档中进行了记录onReceive():goo.gl/8kPuH
onReceive()在主应用程序(“ UI”)线程以外的线程上调用的任何情况。
由于您是动态注册接收者,因此可以指定另一个线程(UI线程除外)来处理onReceive()。这是通过registerReceiver()的Handler参数完成的 。
也就是说,如果您未指定其他处理程序,它将始终在UI线程上进行处理。
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
正如前面正确回答的答案一样onReceive,如果registerReceiver()调用了接受处理程序的代码,它将在注册的线程上运行 -否则在主线程上运行。
除非接收方已向进行注册,LocalBroadcastManager而广播是通过 sendBroadcastSync-进行的,则显然它将在调用的线程上运行sendBroadcastSync.
and the broadcast is via sendBroadcastSync。当我们使用LocalBroadcastManager注册接收者时,无论使用sendBroadcastSync还是,主线程都必须调用它sendBroadcast。所以关键是LocalBroadcastManager用来注册。我对吗?