轉自CSDN https://blog.csdn.net/fzkf9225/article/details/73480469
實際開發中會有很多關於app的退出問題,我個人比較常見的有兩種:
一、雙擊退出
比如說我們在首頁的時候需要一個雙擊退出的方法,點擊第一次手機的返回鍵時提示:“再點一次退出應用”。之類的話語,我們可以這樣做,對重寫onKeyDown方法,當他第一次點擊的時候提示文字,給一個幾秒的間隔,在這個時間段內第二次點擊退出,才退出應用,首先定義一個靜態變量
private static boolean isExit = false;
然后重寫onKeyDown方法,點擊在某個時間段內點擊兩次退出,才退出應用,當然我們不能再主線程里面操作視圖,這樣我們就需要利用到handler,具體代碼如下:
//主線程處理視圖,isExit默認為false,就是點擊第一次時,彈出"再按一次退出程序" //點擊第二次時關閉應用 Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); isExit = false; } }; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { exit(); return false; } return super.onKeyDown(keyCode, event); } /** * 點擊兩次退出程序 */ private void exit() { if (!isExit) { isExit = true; Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); // 利用handler延遲發送更改狀態信息 mHandler.sendEmptyMessageDelayed(0, 2000); } else { finish(); //參數用作狀態碼;根據慣例,非 0 的狀態碼表示異常終止。 System.exit(0); } }
二、在登錄頁面點擊退出
在實際開發中,我們需要在個人中心退出登錄,當我們退出登錄后我們一般正常邏輯是退出當前頁面跳轉到登錄頁面,這是我們就在登錄頁面可以重新登錄,或者退出應用,這是我們點擊返回鍵就不是返回上一個頁面了,如果這時我們返回上個頁面就很尷尬了,就比如說我退出登錄了然后我返回我又是登錄頁面。當然你可以在再頁面中在onResume中寫個一個刷新頁面的方法,但是我個人覺得這時你退出后在返回總是不合理的即使你做了刷新操作刷新掉了登錄狀態,但是我覺得總不好
因此我們需要把登錄頁面的退出改為點擊手機返回鍵后提示彈框是否退出應用,點擊確定在activity棧中找到所有的activity銷毀掉然后退出,這樣我們可以首先寫一個appManager的Activity的管理類
package com.demo.assets.util; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import java.util.Stack; /** * Created by 唐小糖 on 2017/6/15. * 應用程序Activity管理類:用於Activity管理和應用程序退出 * 可以讓所有的activity都繼承BaseActivity然后給activity在onCreate中添加到棧中onDetroyed中移除 * * 添加Activity到堆棧 * AppManager.getAppManager().addActivity(this); * 結束Activity&從堆棧中移除 * AppManager.getAppManager().finishActivity(this); * */ public class AppManager { private static Stack<Activity> activityStack; private static AppManager instance; private AppManager(){} /** * 單一實例 */ public static AppManager getAppManager(){ if(instance==null){ instance=new AppManager(); } return instance; } /** * 添加Activity到堆棧 */ public void addActivity(Activity activity){ if(activityStack==null){ activityStack=new Stack<Activity>(); } activityStack.add(activity); } /** * 獲取當前Activity(堆棧中最后一個壓入的) */ public Activity currentActivity(){ Activity activity=activityStack.lastElement(); return activity; } /** * 結束當前Activity(堆棧中最后一個壓入的) */ public void finishActivity(){ Activity activity=activityStack.lastElement(); finishActivity(activity); } /** * 結束指定的Activity */ public void finishActivity(Activity activity){ if(activity!=null){ activityStack.remove(activity); activity.finish(); activity=null; } } /** * 結束指定類名的Activity */ public void finishActivity(Class<?> cls){ for (Activity activity : activityStack) { if(activity.getClass().equals(cls) ){ finishActivity(activity); } } } /** * 結束所有Activity */ public void finishAllActivity(){ for (int i = 0, size = activityStack.size(); i < size; i++){ if (null != activityStack.get(i)){ activityStack.get(i).finish(); } } activityStack.clear(); } /** * 退出應用程序 */ public void AppExit(Context context) { try { finishAllActivity(); ActivityManager activityMgr= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); activityMgr.restartPackage(context.getPackageName()); System.exit(0); } catch (Exception e) { } } }
在寫好管理類后我們有兩種方法去做,第一、我們可以讓所有的Activity繼承BaseActivity,然后在BaseActivity中的oncreate方法中把這個Activity加入到棧里去
//添加Activity到堆棧
AppManager.getAppManager().addActivity(this);
在onDestroyed中銷毀掉 //結束Activity&從堆棧中移除
AppManager.getAppManager().finishActivity(this);
最后在登錄頁面點擊退出出現彈框,確定后我們調用AppManager的退出方法,登錄頁面代碼如下
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { CommonUtils.Exit(this); return true; } return super.onKeyDown(keyCode, event); } CommonUtils類代碼如下 package com.demo.assets.util; import android.content.Context; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; /** * Created by 唐小糖 on 2017/6/15. * 登錄頁面點擊返回鍵退出應用 */ public class CommonUtils { /** * 退出程序 * @param cont */ public static void Exit(final Context cont) { AlertDialog.Builder builder = new AlertDialog.Builder(cont); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setTitle("確定退出維修資金嗎?"); builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); //退出 AppManager.getAppManager().AppExit(cont); } }); builder.setNegativeButton("再逛逛", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } }
第二種、方法
如果你不繼承BaseActivity的話就在每個Activity中在oncreate中添加到appManager中的棧,onDestroy中移除,總之一句就是有多少個Activity就執行多少次