Android BroadcastReceiver处理多条消息

时间:2015-08-10 10:47:23

标签: android broadcastreceiver

我想知道BroadcastReceivers如何处理多个消息请求(广播意图)。

假设BroadcastReceiver仍然在UI线程上处理消息/意图,同时从其他一些线程触发另一个广播消息。将子广播的广播消息放入队列中还是什么?

THX

2 个答案:

答案 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();
        }
    }
};

我希望这会对你有所帮助。