现在的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);即可
全部代码:
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 }