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

简介: 现在的APP退出的时候都不是让用户点击了“后退键”就退出。防止用户点错了后退键而造成的用户体检不好。 一年前搞的Demo代码不见了,重新写下就当是复习和以后直接拿来用把 目前流行的解决一般分为两种: 一、按一次后退键显示一个对话框决定是否退出 1 @Override 2 ...

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

 

相关文章
|
3月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
184 2
|
23天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
46 15
Android 系统缓存扫描与清理方法分析
|
24天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
48 5
|
2月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
46 2
|
2月前
|
存储 XML API
安卓应用程序开发:从新手到专家的旅程
【8月更文挑战第33天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何从一个对安卓应用程序开发一无所知的新手,成长为一个能够独立开发复杂应用程序的专家。我们将通过实际案例和代码示例,深入理解安卓开发的各个方面,包括用户界面设计、数据存储、网络通信等。无论你是刚刚入门,还是已经有一些基础,这篇文章都将为你提供宝贵的知识和技能,帮助你在安卓开发的道路上更进一步。
|
3月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
207 1
|
3月前
|
Android开发
我的Android进阶修炼:安卓启动流程之init(1)
本文深入分析了Android系统中的init进程,包括其源码结构、主要功能以及启动流程的详细注解,旨在帮助读者理解init作为用户空间的1号进程在Android启动过程中的关键作用。
64 1
|
3月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
434 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
存储 传感器 定位技术
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
《移动互联网技术》 第四章 移动应用开发: Android Studio开发环境的使用方法:建立工程,编写源程序,编译链接,安装模拟器,通过模拟器运行和调试程序
188 0
|
11月前
|
网络协议 Android开发 虚拟化
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th
104 0
Android Studio无法运行程序调试程序出现Unable to connect to ADB.Check the Event Log for possible issues.Verify th