Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在广播接收器中计算耳机按钮的点击次数_Java_Android - Fatal编程技术网

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 {
            //? 
        }
    }