1. 程式人生 > >Android應用的正確退出“姿勢”

Android應用的正確退出“姿勢”

在應用退出時候要關閉棧中所有的Activity才能完全退出應用,下面介紹常用的關閉所有Activity的方法。


一、容器法

顧名思義,容器法就是用一個列表記錄棧中所有的Activity,當應用退出時候遍歷所有的Activity執行finish()方法退出即可。具體實現如下:

import java.util.LinkedList;
import java.util.List;

import android.app.Activity;

/**
 * android退出程式的工具類,使用單例模式<br/>
 * 1、在Activity的onCreate()的方法中呼叫add()方法新增新建立的Activity例項到mActivityList<br/>
 * 2、在Activity的onDestroy()的方法中呼叫remove()從mActivityList移除已經銷燬的Activity例項<br/>
 */
public class ExitAppUtils {
	/**
	 * Activity的容器
	 */
	private List<Activity> mActivityList;
	private static ExitAppUtils instance;

	/**
	 * 將建構函式私有化
	 */
	private ExitAppUtils() {
		mActivityList = new LinkedList<Activity>();
	};

	/**
	 * 獲取ExitAppUtils的例項,保證只有一個ExitAppUtils例項存在
	 * 
	 * @return
	 */
	public static ExitAppUtils getInstance() {
		if (instance == null) {
			synchronized (ExitAppUtils.class) {
				if (instance == null) {
					instance = new ExitAppUtils();
				}
			}
		}

		return instance;
	}

	/**
	 * 新增Activity例項到mActivityList中,在onCreate()中呼叫
	 * 
	 * @param activity
	 */
	public void add(Activity activity) {
		mActivityList.add(activity);
	}

	/**
	 * 從容器中刪除關閉的Activity例項,在onDestroy()中呼叫
	 * 
	 * @param activity
	 */
	public void remove(Activity activity) {
		mActivityList.remove(activity);
	}

	/**
	 * 退出程式的方法
	 */
	public void exit() {
		for (Activity activity : mActivityList) {
			activity.finish();
		}

		System.exit(0);
	}

}

程式碼非常容易理解,如何使用也是顯而易見的。


二、啟動模式法

此方法比較優雅,不需要記錄所有存在棧中Activity,只是根據Activity的singleTask啟動模式的特點來處理即可。首先回顧下singleTask:棧內複用模式。這是一種單例模式,在這種模式下,只要Activity在一個棧中存在,那麼多次啟動此Activity都不會重新建立例項,只會將已經存在的Activity例項切換到棧頂,並移除棧中在該Activity之上的Activity例項(即清空棧頂),並且系統會回撥其onNewIntent方法。再來想象下,在應用中大多都會存在一個主Activity(主頁面),其他Activity都在這個主Activity上進行開啟、切換和關閉等操作,即主Activity總是存在任務棧的棧底。基於這種情況,可以將主Activity的啟動模式設為singleTask,並重寫onNewIntent方法在其中根據條件退出主Activity即可完成應用的退出。具體程式碼如下:

1、修改主Activity的啟動模式:

android:launchMode="singleTask" 

2、重寫主Activity的onNewIntent方法:

//退出標誌
	public static final String EXIT_APP = "exit_app";

	@Override
	protected void onNewIntent(Intent intent) {
		boolean exit_app = intent.getBooleanExtra(EXIT_APP, false);
		if (exit_app) {
			finish();
		}
	}

3、退出應用的操作:

Intent intent = new Intent(SecendActivity.this, MainActivity.class);
				//將退出標誌設為true
				intent.putExtra(MainActivity.EXIT_APP, true);
				startActivity(intent);

與方法一對比可以發現,方法二使用更加簡單,程式碼實現也十分簡單優雅。我更喜歡第二種方式退出應用。