前言:
日常开发过程中,经常会遇到“连续点击两次退出应用”的需求(和“连续点击多次”的需求(如:手机从设置中进入开发者选项)。
直接上代码:
双击退出:
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
版权声明:本文为博主原创文章,转载请附上博文链接!