在我的应用程序中,我创建一个自定义BroadcastReceiver并通过手动注册到我的上下文Context.registerReceiver.我也有一个AsyncTask发送通知程序 - Intents via Context.sendBroadcast.意图是从非UI工作线程发送的,但似乎BroadcastReceiver.onReceive(接收所述Intents)总是在UI线程中运行(这对我有好处).这是保证还是我不应该依赖它?
Com*_*are 155
BroadcastReceiver.onReceive是否总是在UI线程中运行?
是.
Tom*_*yTh 74
由于您动态注册接收器,您可以指定另一个线程(UI线程除外)处理onReceive().这是通过registerReceiver()的Handler参数完成的 .
也就是说,如果你没有指定另一个Handler,它将始终在UI线程上处理.
Can*_*ner 61
BroadcastReceiver.onReceive是否总是在UI线程中运行?
通常,这完全取决于您如何注册.
如果您注册BroadcastReceiver使用:
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
Run Code Online (Sandbox Code Playgroud)
它将在主活动线程(也称为UI线程)中运行.
如果您在其他线程上注册BroadcastReceiver使用有效的Handler 运行:
registerReceiver (BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
Run Code Online (Sandbox Code Playgroud)
它将在你的上下文中运行 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
Run Code Online (Sandbox Code Playgroud)
如前所述正确陈述的答案onReceive将在其注册的线程上运行,如果registerReceiver()它接受处理程序的味道 被调用 - 否则在主线程上.
除非接收者已注册LocalBroadcastManager并且广播是通过 sendBroadcastSync- 它显然会在调用的线程上运行sendBroadcastSync.