您现在的位置是:首页 > 文章详情

Android项目实战(二):安卓应用程序退出的三种方法

日期:2018-04-28点击:439
原文: Android项目实战(二):安卓应用程序退出的三种方法

现在的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 }

 

原文链接:https://yq.aliyun.com/articles/678889
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章