在BroadcastReceiver中点击耳机按钮

时间:2011-06-10 16:20:18

标签: java android

在我onReceive(Content context, Intent intent)的{​​{1}}方法内部,我需要计算耳机按钮点击次数(单次,双次,三次),由public class MediaButtonIntentReceiver extends BroadcastReceiver表示KeyEvent.ACTION_DOWN 1}}。

我几乎可以工作,但我现在的算法很糟糕,几次后不可靠。基本上每个连续的ACTION_MEDIA_BUTTON(在前一个ACTION_DOWN的某个毫秒内命中)我会ACTION_DOWN。但是我也需要看看用户何时完成按下,所以在每次事件之后我都会启动numClicks++,如果它用完了就没有新的点击,那么我已经完成了,现在知道了这个数字点击次数

我遇到的问题如下:首先,按钮本身看起来很嘈杂 - 如果我按得太快,我通常会错过一次点击。二,经过一些试验,当它加载的应用程序,它开始随机,我假设有多个CountDownTimer线程(是正确的词?)仍在运行,这使我的东西搞砸了。

无论如何这里是主要的代码片段:

//注意:CountDownTimer使用thisClickTime

System.currentTimeMillis()

作为参考,我一直在寻找类似的东西:

http://musicqueueproject.googlecode.com/svn-history/r83/trunk/src/com/yannickstucki/android/musicqueue/old/PlayerService.java

查看是否有一种注册点击次数的好方法。我不太了解他们的代码,从我看到他们只处理单击/双击(我可能需要三倍和四倍)。

编辑 - 上传了我正在使用的当前代码。它在大多数时候都非常适合。这就是我注意到的事情:如果我的按钮测试时间过于接近,结果会开始搞砸并计算点击次数。我认为这是因为之前尝试的其他CountDownTimers仍然打开,当它们完成时,它们会重置某些状态变量(numClicks = 0,一个)。我在滥用计时器吗?我想不出另一个解决方案,因为我需要在最后一次点击后确定点击完成时间的经过时间的概念。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您的BroadcastReceiver已在清单中注册,则BroadcastReceiver仅对onReceive()的一次调用存在 - 后续广播可能会导致另一个BroadcastReceiver实例。并且清单注册的BroadcastReceiver无法分叉线程,因为整个过程可能会在onReceive()结束后关闭。

我怀疑是否有一种简洁的方法可以使您的代码可靠,因为媒体按钮并非专为您的预期用途模式而设计。