![](http://static.blog.csdn.net/images/category_icon.jpg)
版权声明:本文为博主原创文章,转载请注明出处。
LZ-Says:给大家推荐一个网站,有兴趣可以查阅,想为大家贡献一点自己的力量也可以投稿,老大审核通过会发表,更好的帮助有需要的人~欢迎大家踊跃投稿~地址如下:
http://www.123si.org/android去年真的浪费了好多的机会,,,而今年,却找不到一个合适的机会,,,还是自己能力有所欠缺啊。。。从一点点开始积累吧。。。那个谁,,,这次,我会很自信站在你面前!!!
记得去年曾经让LZ写一个连续点击返回键俩次退出程序,,,憋了好久没憋出来。。。23333。。。
下面先说说LZ思路,具体如下:
1. 第一种就是根据用户点击俩次的时间间隔去判断是否退出程序;
2. 第二种就是使用Android中计时器(Timer),其实这俩种都差不多.
思路是有了,,,接下来要怎么开搞呢???用户点击肯定会触发相应的事件,,,我们先来看下面俩个事件的作用。。。
-
Activity.onKeyDown();
当某个键被按下时会触发,但不会被任何的该Activity内的任何view处理。
默认按下KEYCODE_BACK键后会回到上一个Activity。 -
Activity.onKeyUp():
当某个按键被按下,松开后触发,但不会被任何的该Activity内的任何view处理。
默认没有执行任何操作,只是简单的给一个false作为返回值。
So,,,接下来分别使用如上俩个方法干掉这个当年的拦路虎~
One Way:onKeyUp()
//--------------使用onKeyUp()干掉他--------------
//记录用户首次点击返回键的时间
private long firstTime=0;
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode){
case KeyEvent.KEYCODE_BACK:
long secondTime=System.currentTimeMillis();
if(secondTime-firstTime>2000){
Toast.makeText(MainActivity.this,"再按一次退出程序--->onKeyUp",Toast.LENGTH_SHORT).show();
firstTime=secondTime;
return true;
}else{
System.exit(0);
}
break;
}
return super.onKeyUp(keyCode, event);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
Two Way:onKeyDown()
//--------------使用onKeyDown()干掉他--------------
//记录用户首次点击返回键的时间
private long firstTime=0;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){
if (System.currentTimeMillis()-firstTime>2000){
Toast.makeText(MainActivity.this,"再按一次退出程序--->onKeyDown",Toast.LENGTH_SHORT).show();
firstTime=System.currentTimeMillis();
}else{
finish();
System.exit(0);
}
return true;
}
return super.onKeyDown(keyCode, event);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
Three Way:Timer
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
exitByDoubleClick();
}
return false;
}
private void exitByDoubleClick() {
Timer tExit=null;
if(!isExit){
isExit=true;
Toast.makeText(MainActivity.this,"再按一次退出程序--->Timer",Toast.LENGTH_SHORT).show();
tExit=new Timer();
tExit.schedule(new TimerTask() {
@Override
public void run() {
isExit=false;//取消退出
}
},2000);// 如果2秒钟内没有按下返回键,则启动定时器取消掉刚才执行的任务
}else{
finish();
System.exit(0);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
OK,,,LZ介绍完三种写法,,,有好一点的写法可以告诉我哦~
2017年7月6日00:14:59更新:
听到一个哥儿们提供了一种思路,大家有兴趣可以实践下:
重写onkeydown 在里面利用handle的延时发送来实现 showToast(“确定要退出?xxx欢迎您下次再来”);
// 利用handler延迟发送更改状态信息 handler.sendEmptyMessageDelayed(0, 2000);
/** * Created by Administrator on 2017/7/17 0017. */ public class DoubleExitTwo extends AppCompatActivity { // 定义一个变量,来标识是否退出 private static boolean isExit = false; private static Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); isExit = false; } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.doubleexit_two); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //拦截返回键 if (keyCode == KeyEvent.KEYCODE_BACK) { exit(); return true; } return super.onKeyDown(keyCode, event); } /**** * 实现点击两次BACK键退出应用 ****/ private void exit() { //第一次点击默认进入,给用户提示再按一次 if (!isExit) { isExit = true;//标记为可以退出程序 Toast.makeText(getApplicationContext(), "再按一次退出程序>>>mHandler", Toast.LENGTH_SHORT).show(); //清除上一次的handler中的消息队列 mHandler.removeMessages(0); // 利用handler延迟发送更改状态信息 // 超过2秒,恢复初始状态 mHandler.sendEmptyMessageDelayed(0, 2000); } else { //在2秒内,再次点击返回,关闭当前的界面 System.exit(0); } } }