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

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

应用程序退出提示

时间: 2024-08-26 02:19:44

安卓应用程序退出的两种方法的相关文章

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

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

返回键捕获 应用程序退出的两种方式(转)

作为应用程序一个较好的用户体验应该是:在退出应用程序前询问用户是否真正退出?目前普遍做法是,一在退出前询问是否真正退出,二是连续按两下退出. 返回键捕获 应用程序退出的两种方式 实现上述两种应用退出方式需要在onkeyDown()来进行捕获返回键 在Activity中,如果需要动态注册广播官方文档建议在onResume()进行注册,在onPause()中取消注册.注册部分代码如下: 应用程序退出方式一:确认退出对话框 public boolean onKeyDown(int keyCode, K

C#程序退出的几种方法

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

Android全局退出的两种方法

第一种方法参考<第一行代码>78页 建立一个ActivityCollector类,提供静态方法addActivity,fininshAll(以list为容器) 然后我们建立的Activity都继承一个BaseActivity,在BaseActivity中的oncreate方法中,使用ActivityCollector的addActivity(this), 想要随时全局退出只要调用ActivityCollector.finishAll() 今天在看到另一个和Activity启动模式有关的全局退出

程序打印自身代码的两种方法

程序打印自身代码的两种方法 方法一:利用fopen,打开可执行程序对应的source code file /***************************************** code writer : EOF code file : print_my_self.c code date : 2014.08.01 e-mail: [email protected] code purpose : Aha, print out myself! *********************

在Java Web程序中使用监听器可以通过以下两种方法

之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响应,从本质上来说这些都是观察者模式的具体实现,在web程序中的监听器也不例外.在Java Web程序中使用监听器可以通过以下两种方法:通过注解@WebListener来标识一个自定义的监听器:[java] view plain copy@WebListener public class Custom

WPF程序将DLL嵌入到EXE的两种方法

WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了>可以参看地下地址(两篇是一样的): 开源中国 http://my.oschina.net/chinesedragon/blog/308336 CNBLOGS http://www.cnblogs.com/luoshupeng/p/3946635.html 引言 前几一写了一个小工具----<Vi

在linux环境下编译运行OpenCV程序的两种方法

原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之后,我下面就介绍Command Line和CMake两种方式. 首先我先粘上我测试的代码吧,文件名为Test.c 1 #include <highgui.h> 2 3 int main(int argc,char ** argv) { 4 5 IplImage* img = cvLoadImage

黑马程序员【两种Ajax方法】

两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技术已经被人们广泛应用,而对于一些对Web的了解还不是很深入的初学者,Ajax依然带着一层神秘的难懂的色彩,今天就在这里给大家以简单的方式解读一下Ajax的实现步骤和原理,并且给大家两种实现Ajax的方法,js和jquery. 首先ajax其实就是js+xml的技术,前端的表现就是一段js代码.要使用