我想知道BroadcastReceivers如何处理多个消息请求(广播意图)。
假设BroadcastReceiver仍然在UI线程上处理消息/意图,同时从其他一些线程触发另一个广播消息。将子广播的广播消息放入队列中还是什么?
THX
答案 0 :(得分:2)
我认为你想要的是:http://codetheory.in/android-broadcast-receivers/
异步处理
通常在执行接收器类的onReceive()之后 完成后,Android系统可以回收接收器,即 另一个意图可以传递给它。可能长时间运行 操作建议在服务器上触发服务 传递给它的上下文对象。这是任何异步的原因 在API级别11之前不允许执行操作。但是这样做了 现在改变了。
从API 11开始,如果要传递某些任务的处理 另一个线程你可以做这样的事情:
// Sample code from: http://stackoverflow.com/a/22741384 final PendingResult result = goAsync(); Thread thread = new Thread() { public void run() { int i; // Do processing result.setResultCode(i); result.finish(); } }; thread.start();
使用goAsync(),我们返回了一个PendingResult类型的对象 调用finish()方法表示Android系统 接收器不再活着,可以回收利用。
他在这里说的是,你的接收器在完成执行后会被回收,这意味着你可以一次接收一个接收器,但是你可以接收很多接收器。
编辑评论
我对Android框架工程师Dianne Hackborn(https://groups.google.com/forum/#!topic/android-developers/ClIGNuGJUts)发表的声明略微纠正了一下:
特定接收器一次只能处理一个广播。如 每次广播都会发生,它会被处理以确定它的目标 应该去,并分派到每个目标的消息队列。
所以它似乎确实为你创建了一个队列。老实说,我不建议过多依赖广播,它们在最好的时候都很棘手,而且我发现Message Handlers FAR更可靠。但有时候它们是必要的。
我认为这里最好的选择是实际去试试看看会发生什么。
答案 1 :(得分:0)
我将举一个我用于蓝牙连接的示例,该示例显示了如何使用IntentFilter来获取不同的操作:
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
getApplication().registerReceiver(mReceiver, filter);
和BroadcastReceiver:
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
Toast.makeText(getApplicationContext(), "Device not found", Toast.LENGTH_LONG).show();
}
}
};
我希望这会对你有所帮助。