【发布时间】:2015-08-10 10:47:22
【问题描述】:
我想知道 BroadcastReceivers 如何处理多个消息请求(广播意图)。
假设 BroadcastReceiver 仍在 UI 线程上处理消息/意图,同时另一个广播消息从其他线程触发。后续的广播消息会被放入队列还是什么的?
谢谢
【问题讨论】:
我想知道 BroadcastReceivers 如何处理多个消息请求(广播意图)。
假设 BroadcastReceiver 仍在 UI 线程上处理消息/意图,同时另一个广播消息从其他线程触发。后续的广播消息会被放入队列还是什么的?
谢谢
【问题讨论】:
我想你想要的就在这里:http://codetheory.in/android-broadcast-receivers/
异步处理
一般在receiver类的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) 的声明稍作纠正:
特定接收器一次只能处理一个广播。作为 每次广播发生时,都会对其进行处理以确定它的目标 应该去,并分派到每个目标的消息队列中。
看来它确实为您创建了一个队列。老实说,我不建议过分依赖广播,在最好的情况下它们很棘手,而且我发现消息处理程序更可靠。但有时它们是必要的。
我认为最好的选择是亲自去尝试一下,看看会发生什么。
【讨论】:
我将举一个用于蓝牙连接的示例,展示如何使用 IntentFilter 来获取不同的操作:
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
getApplication().registerReceiver(mReceiver, filter);
还有广播接收器:
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();
}
}
};
希望对你有帮助。
【讨论】: