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

原文: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://www.cnblogs.com/lonelyxmas/p/8970165.html

时间: 2024-12-29 23:23:04

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

安卓应用程序退出的两种方法

现在的APP退出的时候都不是让用户点击了“后退键”就退出.防止用户点错了后退键而造成的用户体检不好. 一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把 目前流行的解决一般分为两种: 一.按一次后退键显示一个对话框决定是否退出 1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 // TODO Auto-generated method stub 4 //点击了后退键 5 if(keyCo

【Android】Eclipse自己主动编译NDK/JNI的三种方法

[Android]Eclipse自己主动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:[email protected] 一.Eclipse关联cygwin 1. project->右击选择Properties->选择Builders,在Builders中选择New创建一个Program 2. 參数配置 二.Eclipse关联ndk-build(自建Builder方法)  1. Project->Properties->Builder

js之二维数组定义和初始化三种方法

方法一:直接定义并且初始化,这种遇到数量少的情况可以用 var _TheArray = [["0-1","0-2"],["1-1","1-2"],["2-1","2-2"]] 方法二:未知长度的二维数组 var tArray = new Array();   //先声明一维 for(var k=0;k<i;k++){        //一维长度为i,i为变量,可以根据实际情况改变

二十一、安装软件包的三种方法、RPM包介绍、rpm工具用法、yum工具用法、yum搭建本地仓库

一.安装软件包的三种方法 rpm工具.yum工具.源码包 RPM工具:是以一种数据库记录的方式将需要的套件安装到Linux主机的一套管理程序.就是说,你的Linux系统中有一个关于RPM的数据库,它记录了安装的包以及包与包之间的依赖关系.RPM包是预先在Linux机器上编译并打包的文件,安装快捷.缺点:安装环境必须与编译时的环境一致或相当,包与包之间存在着相互依赖的情况,卸载包时需先把依赖的包卸载.若依赖的包是系统必需的,就不能卸载这个包,否则系统崩溃. yum工具:优势:可联网下载所需要的RP

Android程序完全退出的三种方法

作者: Android开发网原创 时间: 2010-06-10 很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现. 首先要说明在B中直接使用finish(),接下来手机显示的还是主窗口A,所以一起来看看Android开发网是如何实现的吧. 1. Dalvik VM的本地方法 android.os.Process.killProcess(android.

C#程序退出的几种方法

方法一: this.Close();    //只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 方法二: Application.Exit();   //强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出: 方法三: Application.ExitThread();  //强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题: 方法四: System.Environment.Exit(0);   

Android程序全然退出的三种方法

1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid())    //获取PID,眼下获取自己的也仅仅有该API,否则从/proc中自己的枚举其它进程吧,只是要说明的是,结束其它进程不一定有权限,不然就乱套了. System.exit(0);   //常规java.c#的标准退出法,返回值为0代表正常退出 2. 任务管理器方法 首先要说明该方法执行在Android 1.5 API Level为3以上才干

C#计算一段程序运行时间的三种方法

第一种方法利用System.DateTime.Now static void SubTest() { DateTime beforDT = System.DateTime.Now; //耗时巨大的代码 DateTime afterDT = System.DateTime.Now; TimeSpan ts = afterDT.Subtract(beforDT); Console.WriteLine("DateTime总共花费{0}ms.", ts.TotalMilliseconds);

Android 记录和恢复ListView滚动的位置的三种方法

本文主要介绍记录和恢复listView滚动位置的3种方法(1)记录listView滚动到的位置的坐标(推荐)(2)记录listView显示在屏幕上的第一个item的位置(3)通知适配器数据改变. 有时在view切换时,需要恢复listView之前滚动到的位置,鉴于网上已有资料说的都是第二种方法,而第二种方法本身在精确度上较差,自己找到了第一种方法分享下. 1.记录listView滚动到的位置的坐标,然后利用listView.scrollTo精确的进行恢复 listView.setOnScroll