BroadcastReceiver异步onReceive

时间:2013-10-02 14:51:46

标签: android usb broadcastreceiver

正如标题所说,有没有办法异步运行BroadcastReceiver onReceive()方法?

基于它的实现,android在主线程上运行onReceive()方法。

我正在使用BroadcastReceiver明确请求与USB设备通信的权限。当请求权限对话框已获得权限时,将调用onReceive()方法,但由于它在主线程上运行,因此在完成时无法(至少不是我所知道的)发出信号。轮询布尔标志会阻塞主线程,这反过来会阻止调用onReceive()方法。

有没有办法异步调用onReceive(),还是有另一种方法可以显式(不使用清单中的意图过滤器)请求权限并连接到USB设备?

编辑:我希望方法会阻止,直到获得权限并建立连接。

3 个答案:

答案 0 :(得分:1)

您可以在广播接收器的onReceive中发送广播。广播意图可以在Activity的生命周期方法中注册,也可以在同一个中注销。

答案 1 :(得分:1)

您可以根据自己的喜好进行部分异步行为。

从Honeycomb开始,你可以调用goAsync(),然后你有10秒左右的时间来异步地完成你的工作。

可以显示使用示例here

答案 2 :(得分:0)

首先,你不应该做任何阻塞主线程的事情。其次,除非你使用registerReceiver(BroadcastReceiver, IntentFilter, String, Handler),否则你永远不应该在BroadcastReceiver.onReceive中做任何需要花费很多时间的事情,因为它很可能会在10秒后被杀死(参见documentation for BroadcastReceiver)。您应该从AsyncTask方法开始onReceive或单独的线程。如果要在连接USB设备之前停止与UI其余部分的交互,请在不阻塞主线程的情况下执行此操作。显式禁用内容或使用加载GIF或除阻止之外的任何内容切换到一些简单的Fragment或Activity。阻塞主线程将导致等待或终止系统对话框弹出,并且没有用户选择等待。

您的问题的简单答案是使用registerReceiver以编程方式注册接收器,而不是使用清单,但我必须首先提供一些免责声明。