Java 在广播接收器中计算耳机按钮的点击次数
在我的Java 在广播接收器中计算耳机按钮的点击次数,java,android,Java,Android,在我的公共类MediaButtonEntreceiver Extended BroadcastReceiver的onReceive(内容上下文,意图意图)方法中,我需要计算耳机按钮的点击次数(单次、双次、三次),点击次数由KeyEvent.ACTION\u DOWN按钮的表示 我所做的几乎可以工作,但我目前的算法很糟糕,而且几次之后就不可靠了。基本上,每个连续的操作_DOWN(在前一个操作_DOWN的特定毫秒数内点击)我都会numClicks++。但我还需要查看用户何时按完键,因此在每次事件后我
公共类MediaButtonEntreceiver Extended BroadcastReceiver的onReceive(内容上下文,意图意图)
方法中,我需要计算耳机按钮的点击次数(单次、双次、三次),点击次数由KeyEvent.ACTION\u DOWN
按钮的表示
我所做的几乎可以工作,但我目前的算法很糟糕,而且几次之后就不可靠了。基本上,每个连续的操作_DOWN
(在前一个操作_DOWN
的特定毫秒数内点击)我都会numClicks++
。但我还需要查看用户何时按完键,因此在每次事件后我都会启动一个倒计时
,如果在它运行时没有新的点击,那么我就完成了,现在知道了点击次数
我遇到的问题如下:首先,按钮本身似乎很吵——如果我按得太快,我通常会错过一次点击。第二,在加载应用程序的几次尝试之后,它开始变得随机,我假设有多个CountDownTimer
线程(这是正确的词吗?)仍在运行,这会把我的东西搞砸
总之,这里是主要的代码片段:
//注意:thisClickTime
使用System.currentTimeMillis()
if(action==KeyEvent.action\u UP){
如果(isDown==true){
如果(numClicks==0&&lastClickTime==0){
//我们有一个新的点击
numClicks++;
lastClickTime=thisClickTime;//更新单击时间
isDown=假;
elapsedTime=此单击时间-上次单击时间;
}否则如果(thisClickTime-lastClickTime10
numClicks++;
lastClickTime=此ClickTime;
isDown=假;
}
最终int oldNumClicks=numClicks;
final CountDownTimer checkIfDone=新的倒计时(单击延迟,10){
公共void onTick(长毫秒未完成){
if(oldNumClicks!=numClicks){
取消();
}
}
public void onFinish(){//计数器完成时执行的代码
if(oldNumClicks==numClicks){
//若用户在clickDelay+X毫秒的时间内不再点击,那个么它就完成了
Toast.makeText(上下文,“点击次数:”+Integer.toString(numClicks),Toast.LENGTH_SHORT.show();
//重置状态变量
numClicks=0;
lastClickTime=0;
}
}
}.start();
}否则{
//?
}
}
作为参考,我一直在研究以下内容:
看看是否有一个很好的方法来记录点击次数。不过,我并不太了解他们的代码,从我所看到的情况来看,他们只处理单次/双击(我可能需要三次和四次)
编辑-上传了我正在使用的当前代码。它在大多数情况下工作得相当不错。但我注意到的是:如果我的按钮测试时间太近,结果就会变得一团糟,点击次数也不够。我认为这是因为以前尝试的其他倒计时程序仍然打开,当它们完成时,它们会重置某些状态变量(例如,numClicks=0)。我是不是误用了计时器?但我想不出其他解决方案,因为我需要一些上次单击后经过时间的概念来确定单击何时完成
谢谢你的帮助 如果您的BroadcastReceiver
已在清单中注册,BroadcastReceiver
将仅存在于对onReceive()
的单个调用中--后续广播可能会导致另一个BroadcastReceiver
实例。并且清单注册的BroadcastReceiver
无法分叉线程,因为一旦onReceive()
结束,整个进程可能会关闭
我怀疑是否有一种干净的方法可以使您的代码可靠,因为媒体按钮根本不是为您的预期使用模式而设计的。如果您的BroadcastReceiver
已在清单中注册,那么BroadcastReceiver
将只存在于对onReceive()的一次调用中
--后续广播可能会导致另一个广播接收器
实例。并且清单注册的BroadcastReceiver
无法分叉线程,因为一旦onReceive()
结束,整个进程可能会关闭
我怀疑是否有一种干净的方法可以让您的代码变得可靠,因为媒体按钮根本不是为您的预期使用模式而设计的。好吧,我在这里非常灵活-我只需要一种可靠的方法来确定某人点击耳机按钮的次数。broadcastreceiver使用IntentFilter(在my mainActivity.Java中)在Java代码中注册,MediaButtonEntreceiver类是它自己的文件(.Java)。现在,如果我等到上一次祝酒差不多结束后再尝试更多的点击,那么计数工作相当可靠。因此,我认为正在发生的事情是,倒计时程序把我搞砸了,因为多个计时器开始了,当它们完成时,它们会重置我的状态变量(numClicks=0,等等)。@user624869:如果MediaButtonEnterpeiver
是由活动注册的,我会使用postDelayed()
来完成你的任务“稍微唤醒我”逻辑。这Runnable
和onReceive()
if (action == KeyEvent.ACTION_UP) {
if (isDown == true) {
if (numClicks == 0 && lastClickTime == 0) {
//we have a new click
numClicks++;
lastClickTime = thisClickTime; //update the click time
isDown = false;
elapsedTime = thisClickTime - lastClickTime;
} else if (thisClickTime - lastClickTime < clickDelay) { //&& thisClickTime - lastClickTime > 10
numClicks++;
lastClickTime = thisClickTime;
isDown = false;
}
final int oldNumClicks = numClicks;
final CountDownTimer checkIfDone = new CountDownTimer(clickDelay, 10) {
public void onTick(long millisUntilFinished) {
if (oldNumClicks != numClicks) {
cancel();
}
}
public void onFinish() { //code that executes when counter is done
if (oldNumClicks == numClicks) {
//if user doesn't click anymore in time clickDelay + X milliseconds, then it's done
Toast.makeText(context, "Number of clicks: " + Integer.toString(numClicks), Toast.LENGTH_SHORT).show();
//reset state variables
numClicks = 0;
lastClickTime = 0;
}
}
}.start();
} else {
//?
}
}