【问题标题】:Android BroadcastReceiver handling multiple messagesAndroid BroadcastReceiver 处理多条消息
【发布时间】:2015-08-10 10:47:22
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    我想你想要的就在这里: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) 的声明稍作纠正:

    特定接收器一次只能处理一个广播。作为 每次广播发生时,都会对其进行处理以确定它的目标 应该去,并分派到每个目标的消息队列中。

    看来它确实为您创建了一个队列。老实说,我不建议过分依赖广播,在最好的情况下它们很棘手,而且我发现消息处理程序更可靠。但有时它们是必要的。

    我认为最好的选择是亲自去尝试一下,看看会发生什么。

    【讨论】:

    • 我在这里有点困惑。我可以一次收到一个还是收到很多?或者你说你可以一次处理一个但可能会收到很多?问题是如果我(作为广播接收器)在我仍在处理一个广播消息时收到另一个广播消息怎么办。它会排队还是与当前执行的重叠?
    • 所以你会收到一个,但在接收器被回收(当它完成执行时)之前你不能收到另一个。
    • 因此它们被丢弃了?
    • 答案是:他们不会为你排队。您的接收方一次只能处理一个,如果在您处理过程中收到另一个,则不会被处理并且会丢失。这就是为什么大多数人将响应代码线程化,以便尽快退出和回收接收器。
    • 似乎他们已经为您排队(请参阅上面的编辑),但依赖它会很棘手。在这一点上,我已经为你做了很多研究——如果你觉得这是一个可以接受的答案,请标记为这样
    【解决方案2】:

    我将举一个用于蓝牙连接的示例,展示如何使用 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();
            }
        }
    };
    

    希望对你有帮助。

    【讨论】:

    • 谢谢,但没有询问如何处理不同的操作。
    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多