Android項目實戰(二):安卓應用程序退出的三種方法
阿新 • • 發佈:2018-04-29
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 stub18 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項目實戰(二):安卓應用程序退出的三種方法