Android 实现连续两次点击或连续多次点击退出应用

摘要:
关于“连续多次点击”的代码原理作如下说明:但是当要实现多次点击时,需要使用GoogleAPI提供的方法,原理就是在每次点击之后记录当前的点击时间,并通过System.arraycopy(…

前言:
日常开发过程中,经常会遇到“连续点击两次退出应用”的需求(和“连续点击多次”的需求(如:手机从设置中进入开发者选项)。

直接上代码:
双击退出:

private long exitTime = 0;
    /**
     * 连续点击2次退出
     */
    public void exitAfterTwice() {
        if ((System.currentTimeMillis() - exitTime) > 2000) {
            Toast.makeText(getApplicationContext(), "再按一次退出程序",
                    Toast.LENGTH_SHORT).show();
            exitTime = System.currentTimeMillis();
        } else {
            finish();
            System.exit(0);
        }
    }

连续点击多次:

final static int COUNTS = 5;//点击次数
    final static long DURATION = 3 * 1000;//规定有效时间
    long[] mHits = new long[COUNTS];
    /**
     * 连续点击多次退出
     */
    private void exitAfterMany() {
        /**
         * 实现双击方法
         * src 拷贝的源数组
         * srcPos 从源数组的那个位置开始拷贝.
         * dst 目标数组
         * dstPos 从目标数组的那个位子开始写数据
         * length 拷贝的元素的个数
         */
        System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
        //实现左移,然后最后一个位置更新距离开机的时间,如果最后一个时间和最开始时间小于DURATION,即连续5次点击
        mHits[mHits.length - 1] = SystemClock.uptimeMillis();//System.currentTimeMillis()
        if ((mHits[mHits.length - 1] - mHits[0] <= DURATION)) {
            String tips = "您已在[" + DURATION + "]ms内连续点击【" + mHits.length + "】次了!!!";
            Toast.makeText(MainActivity.this, tips, Toast.LENGTH_SHORT).show();
            finish();
        }
    }

上述代码可直接拿过来使用。关于“连续多次点击”的代码原理作如下说明:

但是当要实现多次点击时,需要使用GoogleAPI提供的方法,原理就是在每次点击之后记录当前的点击时间,并通过System.arraycopy(…)方法来将数组左移,每点击一次就左移一次,当最后一次点击后,数组中从左到右刚好依次记录了每一次的点击时间,此时只要判断首尾两项的间隔时间是否小于设定的时间,如果小于则执行相应的逻辑。

原理图伪代码如下:

//实现左移,然后最后一个位置更新距离开机的时间,如果最后一个时间和最开始时间小于DURATION,即连续5次点击
 init:
        [0,0,0,0,0]
        Click 1:
        [0,0,0,0,10004]
        Click 2:
         [0,0,0,10004,100005]
        Click 3:
         [0,0,10004,100005,100006]
        Click 4:
         [0,10004,100005,100006,100007]
        Click 5:
         [10004,100005,100006,100007,10008]

补充:
通过上述方法,细心的同学可能发现了我们在获取当前时间的毫秒数的时候有两种方式:

SystemClock.uptimeMillis() // 从开机到现在的毫秒数(手机睡眠的时间不包括在内);

System.currentTimeMillis() // 从1970年1月1日 UTC到现在的毫秒数;
一般使用的话,l这两种写法基本没有什么区别,唯一不一样的是:使用System.currentTimeMillis()获取的时间有被篡改的风险

System.currentTimeMillis() 获取的时间,是可以通过System.setCurrentTimeMillis修改的,那么,在某些情况下,一但被修改,时间间隔就不准了。
因此,为了保证时间的准确性,大家可以使用第二种方式。

还有一点,顺带说一下,大家在使用上述方法时,注意是点击屏幕退出和点击按键退出,这两种的event 不同(MotionEvent和KeyEvent),大家别搞混了。

@Override
    public booleandispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() ==MotionEvent.ACTION_DOWN) {
            //todo 在此处调用

        }
        return super.dispatchTouchEvent(ev);
    }
    @Override
    public booleandispatchKeyEvent(KeyEvent event) {
        if (event.getAction() ==KeyEvent.ACTION_DOWN) {
            //todo 在此处调用

        }
        return super.dispatchKeyEvent(event);
    }

好了,至此完结。小伙伴有疑问的话,请留言。
---------------------
作者:游走的大千世界的烤腰子
来源:CSDN
原文:https://blog.csdn.net/zhangqunshuai/article/details/81938770
版权声明:本文为博主原创文章,转载请附上博文链接!

免责声明:文章转载自《Android 实现连续两次点击或连续多次点击退出应用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Superfish jQuery菜单插件一名Delphi程序员的开发习惯下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在Visual Studio中使用MonoTouch开发iOS应用程序(下):开发体验 狼人:

对于熟悉.NET程序员来说,编写iOS应用程序的最佳选择自然是MonoTouch。在上一篇文章里,我们已经在Mac OS X上安装了MonoTouch开发环境,并已经能够在Mac OS X和Windows之间共享文件。现在我们就可以来简单体验一下,如何使用Visual Studio,Interface Builder以及少量的MonoDevelop来开发一...

C#发送邮件(使用SSL,587端口)

static readonly string smtpServer = System.Configuration.ConfigurationManager.AppSettings["SmtpServer"]; static readonly string userName = System.Configuration.Configurati...

vue 数组push元素 视图没更新

Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下: push() pop() shift() unshift() splice() sort() reverse() 问题描述:在tap栏下,给每个tab添加一行数据,默认行就可以一直添加,切换到1号的tab添加时,数组已经添加成功,但是视图就是没有变化,来回切换才手动更新 ...

mui日期设置与时钟样式时间设置

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-s...

C# Web Service简单使用

第一步 打开VS,新建一个项目   第二步  创建一个ASP.NET 空 Web应用程序 我这里用的是VS2017 第三步 添加一个Web 服务(ASMX) 右键解决方案-->添加-->新建项 找到Web 服务(ASMX) 第四步 编写WebService的代码部分 创建完成后可以看到下面的画面 默认有个Hello Word的方法,我...

Android中RadioGroup的初始化和简单的使用

一简介: RadioGroup作为一个单选按钮组,可以设置为性别选择男或则女,地址选择等等,作为一个android入门级选手,就简单的说一下RadioGroup组中RadioButton的布局和初始化操作,以及禁用整个RadioGroup。 二具体介绍: 布局: <RadioGroup androi...