4

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

基于其实现,androidonReceive()在主线程上运行该方法。

我正在使用BroadcastReceiver明确请求与 USB 设备通信的权限。当请求权限对话框获得权限时,该onReceive()方法被调用,但由于它在主线程上运行,所以没有办法(至少,我不知道)在完成时发出信号。对布尔标志进行轮询会阻塞主线程,而主线程又会阻止onReceive()调用该方法。

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

编辑:我希望该方法阻塞,直到获得许可并建立连接。

4

3 回答 3

2

你可以有你想要的部分异步行为。

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

用法示例可以在这里显示。

于 2014-05-17T16:36:15.687 回答
1

首先,你不应该做任何阻塞主线程的事情。其次,除非你使用,否则你 registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)不应该做任何需要花费大量时间的事情,BroadcastReceiver.onReceive因为它很可能会在 10 秒后被杀死(参见BroadcastReceiver 的文档)。您应该从该方法启动一个AsyncTask或单独的线程。onReceive如果您想在 USB 设备连接之前停止与 UI 的其余部分交互,请不要阻塞主线程。显式禁用某些东西或切换到一些简单的片段或活动,其中包含加载 GIF 或除阻塞之外的任何内容。阻塞主线程将导致弹出等待或杀死系统对话框,并且没有用户选择等待。

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

于 2013-10-02T15:41:37.883 回答
1

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

于 2013-10-02T15:02:19.920 回答