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

直接上代码:
双击退出:

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. Redis 通过 info 查看信息和状态

    INFO INFO [section] 以一种易于解释(parse)且易于阅读的格式,返回关于 Redis 服务器的各种信息和统计数值. 通过给定可选的参数 section ,可以让命令只返回某一部分 ...

  2. iptables防火墙端口操作

    1.将开放的端口写入iptables中,在终端中输入命令: /sbin/iptables -I INPUT -p tcp --dport -j ACCEPT 2.保存上一步的修改内容,输入命令: /e ...

  3. hibernate框架学习之数据查询(HQL)helloworld

    package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...

  4. BZOJ 3620: 似乎在梦中见过的样子

    似乎在梦中见过的样子.... 一道水题调了这么久,还半天想不出来怎么 T 的...佩服自己(果然蒟蒻) 这题想想 KMP 但是半天没思路瞟了一眼题解发现暴力枚举起始点,然后 KMP 如图: O( n2 ...

  5. GigE IP地址配置

    目前有三种配置Gige地址的方法: 1)动态获取DHCP 连接的PC上有DHCP server,可以分配给摄像头IP地址 2)静态IP 通过 设备自身的配置命令,来修改摄像头的IP地址,例如DALSA ...

  6. C# 我的小画板

    我的画板 先看实现图 实现过程 using System; using System.Collections.Generic; using System.ComponentModel; using S ...

  7. HTML阻止冒泡事件的发生

    阻止事件冒泡函数(低级标签的点击事件触发后,上级标签的点击事件再触发,此函数就是防止冒泡事件发生) function stopEventBubble(event){ var e=event || wi ...

  8. Confluence 6 为空白空间重置原始默认内容

    希望重置为原始的默认内容: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 在左侧的面板中选择 全局模板和蓝图(Global Templates and ...

  9. 洛谷P2014 选课

    首先分析题目,这是一道树形dp的题目,是树形背包类的问题,以为每门课的先修课只有一门,所以这一定可以 构成一个森林结构,于是我们可以设计一个虚拟的根节点作为森林的根. 状态转移方程如下 dp[v][k ...

  10. Spark启动时的master参数以及Spark的部署方式

    我们在初始化SparkConf时,或者提交Spark任务时,都会有master参数需要设置,如下: conf = SparkConf().setAppName(appName).setMaster(m ...