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

直接上代码:
双击退出:

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 boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
//todo 在此处调用 }
return super.dispatchTouchEvent(ev);
} @Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
//todo 在此处调用 } return super.dispatchKeyEvent(event);
}

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

Android 实现连续两次点击或连续多次点击退出应用的更多相关文章

  1. React Native 适配Android物理返回键,实现连续两次点击退出

    一直使用iPhone作为测试机开发,提交给测试同事Android版本后发现很多适配问题,其中一个非常明显的是,弹出一个modal后,点击Android的返回键,modal不会消失,直接navigati ...

  2. MonkeyRunner 连续两次点击报“Error sending touch event”

    最近用monkeyrunner做自动化测试,遇到连续两次点击,第二次点击就会报错“Error sending touch event”. 具体做法如下: device.touch(234,112, ' ...

  3. Android中实现两次点击返回键退出本程序

    1,当用户使用我们的app的时候,有时候无意的或者不是有心的按下了我们的返回键,这时候为了更好的用体验,我们需要让用户再一次确定一下,以便判断用户的真实意图 代码如下: //该功能实现退出时提示的功能 ...

  4. 关于android app两次点击返回键退出的处理

    现在的android app在开发时,引入了两次点击返回键退出app的设计 为了避免用户误触,这个设计很人性化 中文网上社区有些同学贴了一些实现的例子,我觉得不是很好 代码如下 public bool ...

  5. Android防止按钮快速重复点击

    在用户使用 Android 应用的时候,经常会出现过快且多次点击同一按钮的情况,一方面这是因为应用或手机当前有些卡顿,另一方面也可能是由于很多应用并没有设置按钮点击时的 selector 或者其它按钮 ...

  6. 【转】在Android Studio中下载Android SDK的两种方式(Android Studio3.0、windows)

    在Android Studio中下载Android SDK的两种方式(Android Studio3.0.windows) 方式一.设置HTTP Proxy1. 打开Settings2. 点击HTTP ...

  7. android去掉button默认的点击阴影

    查了资料,发现别人都是说加一个style属性. style="?android:attr/borderlessButtonStyle" 加上了确实管用,但是我绝不是不求甚解的人.追 ...

  8. Android学习—下载Android SDK的两种方式

    在Android Studio中下载Android SDK的两种方式 Android studio下载地址:http://www.android-studio.org/ 方式一.设置HTTP Prox ...

  9. android环境下两种md5加密方式

    在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md ...

随机推荐

  1. RocketMQ 简单梳理 及 集群部署笔记【转】

    一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...

  2. Windows PowerShell 入門(7)-関数編2

    この連載では.Microsoftが提供している新しいシェル.Windows Power Shellの使い方を解説します.前回に引き続きPowerShellにおける関数の取り扱いとして.変数と関数のスコ ...

  3. 关于CaciiEZ端口流量阀值报警的设置

    作者:邓聪聪 环境:CactiEZ v10.1 为了更高效的发现问题,在非工作期间,公司的网络可能会出现一些故障,为了及时解决问题,所以做了一个流量监控,并以邮件的方式发送流量异常的端口,以便及时了解 ...

  4. C# 基础之const

    1.使用 const 关键字来声明某个常量字段或常量局部变量.常量字段和常量局部变量不是变量并且不能修改. 常量可以为数字.布尔值.字符串或 null 引用(Constants can be numb ...

  5. HTTP请求头信息

    常用请求头 User-Agent : 浏览器信息Host : 服务区域名Referer : 通过哪里的链接过来的Origin : 跨域相关Content-Type : POST和PUT请求的数据类型C ...

  6. Linux 网络侦错:无法联机原因分析

    所谓的软件问题,绝大部分就是 IP 参数设定错误啊,路由不对啊,还有 DNS 的 IP 设定错误等等的, 这些问题都是属于软件设定啦!只要将设定改一改,利用一些侦测软件查一查,就知道问题出在哪里了!基 ...

  7. FFmpeg configure: rename cuda to ffnvcodec 2018-03-06

    FFmpeg version of headers required to interface with Nvidias codec APIs. Corresponds to Video Codec ...

  8. 子元素position:absolute定位之后脱离文档流,怎么使子元素撑开父元素

    纯粹的CSS无法实现.因为position:absolute就是脱离文档流,怎么能让父元素不塌陷呢? 目前想到的只能用js和jquery来实现了,用js获取子元素的高度,赋值给父元素. <!DO ...

  9. Java实现三大简单排序算法

    一.选择排序 public static void main(String[] args) { int[] nums = {1,2,8,4,6,7,3,6,4,9}; for (int i=0; i& ...

  10. 开发了5年android,我开始了go学习之旅

    前言 做了近5年的android开发,最近项目也是不怎么忙,空闲的时候总会思考一些事情,不过作为移动开发,我个人觉得很有必要学习后台开发,由于公司是Go语言开发的,了解go语言一段时间后,我发现go语 ...