java - 如何一次响应多个广播? Jelly Bean LG 为一项 Activity 发送两次广播

标签 java android broadcastreceiver android-broadcast

我正在使用我发现的一些工作代码 here在通过 ACTION_HEADSET_PLUG 检测耳机连接状态的服务中。我有两部手机用于测试,一部是 Gingerbread Motorola,一部是 Jelly Bean LG。在 Gingerbread 手机上,一切正常...我插入耳机,我会收到来自 Android 的广播,然后我会执行我的工作。在 Jelly Bean 手机上,每次耳机状态更改时我都会收到两 (2) 次广播,因此我自己的东西会被调用两次。我不是 100% 确定,但我不认为这与粘性广播有关,就好像我应该在 Gingerbread 和 Jellybean 手机上看到相同的行为一样。

在 Jelly Bean 手机上过滤“headset_plug”的所有系统 logcat 消息时,我会在耳机状态更改中看到类似以下内容:

02-01 07:39:11.983: I/MusicBrowser(1739): [MediaPlaybackService.java:mHeadsetReceiver.onReady()] oooooo intentIntent { act=android.intent.action.HEADSET_PLUG flg=0x40000010 (has extras) }
02-01 07:39:12.083: I/MusicBrowser(1739): [MediaPlaybackService.java:mHeadsetReceiver.onReady()] oooooo intentIntent { act=android.intent.action.HEADSET_PLUG flg=0x40000010 (has extras) }

我可能弄错了,但一切似乎都是这款手机在微秒内发送两个广播,而摩托罗拉 Gingerbread 只发送一个。我不知道这是否是一个 Android 错误、版本之间的故意更改、这款特定 LG 手机的问题还是什么,但似乎我需要一种方法,在多次发送相同的广播时仅响应一次。

最佳答案

I need a way to respond only one time when the same broadcast is sent out multiple times

如果您连续收到两个、三个或一百万个广播,其中 state 值与前一个广播相比没有更改,则状态没有更改。仅当状态发生变化时才执行“状态已更改”逻辑,而不仅仅是因为您收到了广播。

我无法确定您是否需要专用的 boolean lastHeadsetState 数据成员来检测状态的变化,或者可以从应用程序中的其他内容推断出最后的状态。

现在,理想情况下,您不需要这种逻辑,因为理想情况下,广播只会在状态发生变化时发出一次。你越接近硬件,就会发现越多的设备怪癖。因此,robustness principle越接近硬件就越重要。

关于java - 如何一次响应多个广播? Jelly Bean LG 为一项 Activity 发送两次广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498381/

相关文章:

java - 为什么这会从我的 LinkedList 中删除所有元素?

Android Studio 3.0 list 错误 : unknown element <action> found

Android 立即检测到蓝牙断开连接最多 2 秒

c# - Xamarin Android - BroadcastReceiver 问题 - 无法实例化接收器

Android SQLite 数据库泄露错误

android - 如何从多任务 Pane 中删除安装/卸载接收器以杀死应用程序/强制关闭应用程序?

android - Android中所有 Activity 的单一广播接收器?

java - 如何在 SAP 中使用 BAPI_QUALNOT_CREATE 创建 LONGTEXTS?

java - 如何将字符串数组转换为字节?

java - hibernate 异常:could not insert collection rows