在我的 public class MediaButtonIntentReceiver extends BroadcastReceiver
的 onReceive(Content context, Intent intent)
方法中,我需要计算耳机按钮的点击次数(单次、双次, 三重),由 ACTION_MEDIA_BUTTON
的 KeyEvent.ACTION_DOWN
表示。
我的算法几乎可以工作,但我目前的算法很糟糕,而且在几次之后就不可靠了。基本上每个连续的 ACTION_DOWN
(在前一个 ACTION_DOWN
的特定毫秒数内命中)我都会执行 numClicks++
。但我还需要查看用户何时完成按下,所以在每次事件之后我启动一个 CountDownTimer
,如果在它用完时没有新的点击,那么我就完成了,现在知道点击次数。
我遇到的问题如下:首先,按钮本身看起来很吵——如果我按得太快,我通常会错过一次点击。第二,在加载应用程序时经过几次试验后,它开始变得随机,我假设有多个 CountDownTimer
线程(这个词正确吗?)仍在运行,这把我的东西搞砸了。
无论如何,这是主要代码 fragment :
//注意:thisClickTime
使用System.currentTimeMillis()
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 {
//?
}
}
作为引用,我一直在寻找类似的东西:
看看有没有什么好的方法可以记录点击次数。不过,我不太了解他们的代码,据我所知,他们只处理单击/双击(我可能需要三次和四次)。
编辑 - 上传了我正在使用的当前代码。大多数时候它工作得很好。不过,这是我注意到的:如果我的按钮测试时间太近,结果就会开始搞砸并且计算点击次数。我认为这是因为之前尝试的其他 CountDownTimer 仍处于打开状态,并且当它们完成时,它们会重置某些状态变量(numClicks = 0,其中之一)。那我是在滥用计时器吗?我想不出其他解决方案,因为我需要一些关于上次点击后耗时的概念来确定点击何时完成。
感谢您的帮助。
最佳答案
如果您的 BroadcastReceiver
已在 list 中注册,则 BroadcastReceiver
将仅在对 onReceive()
的一次调用中存在 - 后续广播可能会产生另一个 BroadcastReceiver
实例。 list 注册的 BroadcastReceiver
不能 fork 线程,因为一旦 onReceive()
结束,整个进程可能会关闭。
我怀疑是否有一种干净的方法可以让您的代码可靠,因为媒体按钮根本不是为您的预期使用模式设计的。
关于java - 在 BroadcastReceiver 中计算耳机按钮的点击次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6309238/