现在的APP退出的时候都不是让用户点击了“后退键”就退出。防止用户点错了后退键而造成的用户体检不好。
一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把
目前流行的解决一般分为两种:
一、按一次后退键显示一个对话框决定是否退出
1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 // TODO Auto-generated method stub 4 //点击了后退键 5 if(keyCode == KeyEvent.KEYCODE_BACK) 6 { 7 //创建对话框构建器对象 8 AlertDialog.Builder builder = new AlertDialog.Builder(this); 9 builder.setTitle("温馨提示")//对话框标题 10 .setMessage("确定要退出么?")//对话框内容 11 .setIcon(R.drawable.ic_launcher)//对话框图标 12 .setCancelable(false) //点击对话框之外的部分是否取消对话框 13 .setPositiveButton("确定", new OnClickListener() { 14 15 @Override 16 public void onClick(DialogInterface dialog, int which) { 17 // TODO Auto-generated method stub 18 finish();//结束当前Activity 19 } 20 }) 21 .setNegativeButton("取消", new OnClickListener() { 22 23 @Override 24 public void onClick(DialogInterface dialog, int which) { 25 // TODO Auto-generated method stub 26 dialog.dismiss();//取消对话框 27 } 28 }); 29 //生成对话框 30 Dialog dialog = builder.create(); 31 //显示对话框 32 dialog.show(); 33 } 34 35 return super.onKeyDown(keyCode, event); 36 }
二、连续按两次后退键退出,一般两次按键时间间隔为2秒
(1)一般思路方法:
思路。一个应用程序第一次按后退键为 “第一次” 之后的每次按后退键:对于上一次为“第二次”,对于下一次为"第一次" ,判断两次按键时间的差的绝对值是否小于2000(毫秒)
1 public class MainActivity extends Activity { 2 long timefirst = 0; //一定要是long类型的 3 long timesecond = 0; 4 boolean isKeyBack = false;//当为false ,为应用程序第一次按后退键,第一次按键之后 永为true , 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 } 10 11 @Override 12 public boolean onKeyDown(int keyCode, KeyEvent event) { 13 // TODO Auto-generated method stub 14 15 if(keyCode == KeyEvent.KEYCODE_BACK)//如果点击了撤退键 16 { 17 if(isKeyBack==true) //如果isKeyBack==true 说明第二次点击后退键 18 { 19 timesecond = System.currentTimeMillis();//记录第二次按键的时间 20 System.out.println("2"+timesecond); 21 22 if(Math.abs(timesecond-timefirst)<2000)//说明两次按键间隔小于2秒,满足退出条件,退出Activity 23 { 24 finish(); 25 } 26 else 27 { 28 timefirst = System.currentTimeMillis();//记录第一次按键的时间 29 Toast.makeText(this, "再按一次退出程序", 1).show(); 30 //不满足条件,则设置此次为第一次按键,因为isKeyBack为true 31 //屏蔽后退键的撤销功能 32 return true; 33 } 34 } 35 else if(isKeyBack==false) //如果isKeyBack为false 说明第一次点击后退键 36 { 37 timefirst = System.currentTimeMillis();//记录第一次按键的时间 38 Toast.makeText(this, "再按一次退出程序", 1).show(); 39 System.out.println("1"+timefirst); 40 isKeyBack = true; 41 //屏蔽后退键的撤销功能 42 return true; 43 44 } 45 } 46 47 return super.onKeyDown(keyCode, event); 48 }
(2)优化方法
1 public class MainActivity extends Activity { 2 long timefirst = 0; //一定要是long类型的 3 long timesecond = 0; 4 boolean isKeyBack = false; 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 } 10 11 @Override 12 public boolean onKeyDown(int keyCode, KeyEvent event) { 13 // TODO Auto-generated method stub 14 if(keyCode==KeyEvent.KEYCODE_BACK) 15 { 16 timesecond = System.currentTimeMillis(); //记录当前按键时间,相当于上一次为第二次按键 17 if(timesecond-timefirst<2000) //如果两次按键时间小于2000毫秒,结束应用程序 18 { 19 finish(); 20 } 21 else 22 { 23 Toast.makeText(this, "再按一次退出程序", 1).show(); 24 timefirst = timesecond; //如果不能退出,则当前按键时间设为第一次,下一次为第二次 25 return true; //屏蔽后退键的效果 return false;也可以 ,只要不让方法执行super.onKeyDown(keyCode, event);即可
26 } 27 } 28 return super.onKeyDown(keyCode, event); 29 }
全部代码:
1 package com.example.menu; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.app.AlertDialog; 6 import android.app.Dialog; 7 import android.content.DialogInterface; 8 import android.content.DialogInterface.OnClickListener; 9 import android.view.KeyEvent; 10 import android.view.Menu; 11 import android.widget.Toast; 12 13 public class MainActivity extends Activity { 14 long timefirst = 0; //一定要是long类型的 15 long timesecond = 0; 16 boolean isKeyBack = false; 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 } 22 23 @Override 24 public boolean onKeyDown(int keyCode, KeyEvent event) { 25 // TODO Auto-generated method stub 26 if(keyCode==KeyEvent.KEYCODE_BACK) 27 { 28 timesecond = System.currentTimeMillis(); //记录当前按键时间,相当于上一次为第二次按键 29 if(timesecond-timefirst<2000) //如果两次按键时间小于2000毫秒,结束应用程序 30 { 31 finish(); 32 } 33 else 34 { 35 Toast.makeText(this, "再按一次退出程序", 1).show(); 36 timefirst = timesecond; //如果不能退出,则当前按键时间设为第一次,下一次为第二次 37 return true; //屏蔽后退键的效果 38 } 39 } 40 return super.onKeyDown(keyCode, event); 41 } 42 43 // @Override 44 // public boolean onKeyDown(int keyCode, KeyEvent event) { 45 // // TODO Auto-generated method stub 46 // 47 // if(keyCode == KeyEvent.KEYCODE_BACK)//如果点击了撤退键 48 // { 49 // if(isKeyBack==true) //如果isKeyBack==true 说明第二次点击后退键 50 // { 51 // timesecond = System.currentTimeMillis();//记录第二次按键的时间 52 // System.out.println("2"+timesecond); 53 // 54 // if(Math.abs(timesecond-timefirst)<2000)//说明两次按键间隔小于2秒,满足退出条件,退出Activity 55 // { 56 // finish(); 57 // } 58 // else 59 // { 60 // timefirst = System.currentTimeMillis();//记录第一次按键的时间 61 // Toast.makeText(this, "再按一次退出程序", 1).show(); 62 // //不满足条件, 63 // return true; 64 // } 65 // } 66 // else if(isKeyBack==false) //如果isKeyBack为false 说明第一次点击后退键 67 // { 68 // timefirst = System.currentTimeMillis();//记录第一次按键的时间 69 // Toast.makeText(this, "再按一次退出程序", 1).show(); 70 // System.out.println("1"+timefirst); 71 // isKeyBack = true; 72 // return true; 73 // 74 // } 75 // } 76 // 77 // return super.onKeyDown(keyCode, event); 78 // } 79 80 // @Override 81 // public boolean onKeyDown(int keyCode, KeyEvent event) { 82 // // TODO Auto-generated method stub 83 // //点击了后退键 84 // if(keyCode == KeyEvent.KEYCODE_BACK) 85 // { 86 // AlertDialog.Builder builder = new AlertDialog.Builder(this); 87 // builder.setTitle("温馨提示")//对话框标题 88 // .setMessage("确定要退出么?")//对话框内容 89 // .setIcon(R.drawable.ic_launcher)//对话框图标 90 // .setCancelable(false) //点击对话框之外的部分是否取消对话框 91 // .setPositiveButton("确定", new OnClickListener() { 92 // 93 // @Override 94 // public void onClick(DialogInterface dialog, int which) { 95 // // TODO Auto-generated method stub 96 // finish();//结束当前Activity 97 // } 98 // }) 99 // .setNegativeButton("取消", new OnClickListener() { 100 // 101 // @Override 102 // public void onClick(DialogInterface dialog, int which) { 103 // // TODO Auto-generated method stub 104 // dialog.dismiss();//取消对话框 105 // } 106 // }); 107 // 108 // Dialog dialog = builder.create(); 109 // dialog.show(); 110 // } 111 // 112 // return super.onKeyDown(keyCode, event); 113 // } 114 115 }
三、连续按两次后退键退出,一般两次按键时间间隔为2秒(handler方法)
设置一个标记变量isExit = false;
当点击后退按钮的 时候
(1)如果isExit为true 退出程序
(2)如果isExit为false 则提示“两秒内再次后退退出程序”,并是isExit为true,同时发送一个两秒延迟消息,两秒后isExit为false,这样当消息未发送出去前的两秒,再次后退 便可退出程序
1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 4 switch (keyCode){ 5 6 7 case KeyEvent.KEYCODE_BACK: 8 9 if(isExit){ 10 11 return super.onKeyDown(keyCode, event); 12 }else { 13 14 Toast.makeText(this, "再按一下退出程序", Toast.LENGTH_SHORT).show(); 15 isExit = true; 16 17 new Thread(new Runnable() { 18 19 @Override 20 public void run() { 21 22 try { 23 24 Thread.sleep(2000); 25 26 isExit = false; 27 28 } catch (InterruptedException e) { 29 e.printStackTrace(); 30 } 31 32 } 33 34 }).start(); 35 return false; 36 } 37 38 default: 39 return super.onKeyDown(keyCode, event); 40 41 } 42 }