java - 在 BroadcastReceiver 中计算耳机按钮的点击次数

标签 java android

在我的 public class MediaButtonIntentReceiver extends BroadcastReceiveronReceive(Content context, Intent intent) 方法中,我需要计算耳机按钮的点击次数(单次、双次, 三重),由 ACTION_MEDIA_BUTTONKeyEvent.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 {
            //? 
        }
    }

作为引用,我一直在寻找类似的东西:

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

看看有没有什么好的方法可以记录点击次数。不过,我不太了解他们的代码,据我所知,他们只处理单击/双击(我可能需要三次和四次)。

编辑 - 上传了我正在使用的当前代码。大多数时候它工作得很好。不过,这是我注意到的:如果我的按钮测试时间太近,结果就会开始搞砸并且计算点击次数。我认为这是因为之前尝试的其他 CountDownTimer 仍处于打开状态,并且当它们完成时,它们会重置某些状态变量(numClicks = 0,其中之一)。那我是在滥用计时器吗?我想不出其他解决方案,因为我需要一些关于上次点击后耗时的概念来确定点击何时完成。

感谢您的帮助。

最佳答案

如果您的 BroadcastReceiver 已在 list 中注册,则 BroadcastReceiver 将仅在对 onReceive() 的一次调用中存在 - 后续广播可能会产生另一个 BroadcastReceiver 实例。 list 注册的 BroadcastReceiver 不能 fork 线程,因为一旦 onReceive() 结束,整个进程可能会关闭。

我怀疑是否有一种干净的方法可以让您的代码可靠,因为媒体按钮根本不是为您的预期使用模式设计的。

关于java - 在 BroadcastReceiver 中计算耳机按钮的点击次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6309238/

相关文章:

android - 我想从我的 flutter 应用程序启动 WhatsApp 应用程序

java - Android 检查每个 Activity 的网络状态(连续)

java - 高效的模 3 运算?

ADT17 中带有外部库的 Android 测试项目

android - 二维码中的电话号码

以错误的方向保存的 Android 自定义相机图像

java - 从 COM 到 MySql 的串行输入

java - 以编程方式在 fragment 中包含 View 中的布局

java - 有没有办法在cmd窗口中自动换行?

java - JAI 关闭文件句柄是否为时过早?