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

Flo*_*low 38 concurrency multithreading android broadcastreceiver

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

小智 40

onReceive()方法总是在主线程(也称为"UI线程")上调用,除非您使用registerReceiver()变量请求在不同的线程上调度它:

Context.registerReceiver(BroadcastReceiver receiver,
                         IntentFilter filter,
                         String broadcastPermission,
                         Handler scheduler)
Run Code Online (Sandbox Code Playgroud)


Can*_*ner 21

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

通常但并非总是如此,这完全取决于您如何注册.

如果您注册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)

详情在这里这里.


Ste*_*han 18

在主线程上调用onReceive()方法.因此,如果您对所有服务类的访问都是在主线程内完成的,则不需要任何同步.

  • 所以他的问题的答案是否定的!`onReceive`方法不在额外的线程上运行. (4认同)