1. 程式人生 > >Android項目實戰(二):安卓應用程序退出的三種方法

Android項目實戰(二):安卓應用程序退出的三種方法

eat 延遲 用戶 pre html port length tst 二次

原文: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     }

Android項目實戰(二):安卓應用程序退出的三種方法