• 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     }
  • 相关阅读:
    poj 2262
    poj 1050
    poj 1730
    poj 1061
    【设计模式】简单工厂模式学习
    【待学】
    [设计模式]策略模式和单一职责
    Windows live writer 误删 草稿 恢复
    [Linq]Linq To Sql (2)
    MVC 学习日志1(上)
  • 原文地址:https://www.cnblogs.com/xqxacm/p/4789807.html
Copyright © 2020-2023  润新知