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/xqxacm/p/4789807.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Android应用安全实战:Frida协议分析》是一本介绍Frida工具的使用和Android应用安全分析的书籍。Frida是一个强大的动态分析工具,可以帮助开发人员和安全研究人员对应用进行动态分析。本书以Frida为基础,介绍了如何对一些常见的安全问题进行定位和修复。 本书主要分为三部分,第一部分介绍了Frida工具的安装和使用方法,包括如何在Windows、Mac和Ubuntu三个系统上安装Frida,以及如何使用Frida对应用进行动态分析和漏洞挖掘。第部分介绍了一些常见的安全问题,如反调试、class tampering、hook、rpc等问题,并详细介绍了如何通过Frida对这些问题进行分析和修复。第三部分介绍了一些应用案例分析,以及如何通过Frida对应用中的加密算法、网络协议、第三方代码等进行分析。 本书的特点在于实战性强,作者通过大量的实例和案例,让读者能够更加深入地理解Frida工具的使用方法,并能够将所学知识应用到实际的项目中。同时,本书还提供了一些工具和脚本,方便读者能够更加快速地进行分析和修复工作。 总的来说,本书是一本对于安卓开发人员、移动安全研究人员和安全工程师来说非常有价值的工具书,无论是对于入门和提高都有很大的帮助。Frida工具的特点在于动态分析,能够帮助开发人员和安全工程师快速定位和修复常见的安全问题。而本书则是一个详细的实例教程,通过这份教程的学习,读者将能够掌握Frida工具的使用方法,并能够熟练地应用到实际的项目中。 ### 回答2: 《Android应用安全实战:Frida协议分析PDF》是一本针对移动应用安全的实战指南。这本书主要讲述了如何借助Frida这个强大的工具来进行移动应用的安全分析和漏洞挖掘。 Frida是一款可用于对移动应用进行实时动态分析的工具,它的优点在于可以轻松地hook任意函数和类,还可以在不用重新编译应用程序的情况下动态修改应用程序的行为。Frida的这些特性使得它成为了许多黑客和渗透测试人员使用的首选工具之一。 在《Android应用安全实战:Frida协议分析PDF》中,作者首先介绍了Frida工具的基本原理和使用方法,包括安装和配置Frida、使用Frida脚本、使用Frida进行hook等。接着,作者详细介绍了Android应用程序的各个组成部分和重要的安全机制,并给出了许多实例来演示如何通过Frida来绕过这些安全机制。 最后,作者还介绍了一些常用的Frida脚本和工具,比如Hooking SSLPinning脚本、Frida-Extract工具、在Android 8.0上使用Frida等。这些工具和脚本可以帮助读者更快更高效地进行移动应用的安全分析和漏洞挖掘。 总的来说,《Android应用安全实战:Frida协议分析PDF》是一本非常实用的书籍,对于渗透测试人员、黑客和移动应用开发人员来说都具有一定的参考价值。通过学习和掌握Frida这个工具,可以让我们更好地发现和修复移动应用程序中的安全问题,从而提升我们的移动应用程序的安全性和可靠性。 ### 回答3: 《Android应用安全实战:Frida协议分析》是一本关于安卓应用安全的实战教程。该书的重点在于介绍如何使用Frida协议进行应用程序的逆向分析,得出应用程序的安全漏洞,并给出相应的解决方案。 Frida是一个能够在运行时动态注入JavaScript并调试代码的工具。这也意味着Frida能够直接访问运行在内存中的应用程序。这个优势使Frida成为了一个强大的安卓应用程序分析和调试工具。通过使用Frida,用户可以对应用程序进行监视、修改、甚至是攻击。 《Android应用安全实战:Frida协议分析》详细介绍了Frida的使用方法,包括Frida的架构、基本操作、配置和调试应用程序等。此外,该书还介绍了有关安卓应用程序逆向工程和安全审计的实操技能。通过本书的学习,在安卓应用程序的开发过程中,读者可以掌握一定的安全知识和技能,从而提高应用程序的安全性,避免攻击和漏洞的发生。 总之,《Android应用安全实战:Frida协议分析》是一本非常实用、易懂的安卓应用程序安全入门教材。在阅读该书并掌握其中的技能后,用户可以应用这些技能进行应用程序的逆向分析和安全审计,从而达到提高安卓应用程序安全性的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值