文章出處: http://www.cnblogs.com/caobotao/p/5127645.html
關於退出所有Activity,目前網上比較流行的方式大概有以下幾種:
① 使用ActivityManager的方式;
② 自定義一個Activity集合類的方式;
③ 通過發送廣播的方式;
④ 通過殺死當前應用進程的方式;
以上方式的具體實現大家可自行谷歌百度,此處不再贅述。
但是這些方式要麼不太靠譜,要麼有限制,要麼不夠優雅。今天我們就來說一個簡單有效,優雅大方的方式來退出所有的Activity。
原理
先來說一下原理。我們知道,Activity有四種啓動模式,分別爲:standard(默認模式)、singleTop、singleTask、singleInstance。本方式需要使用的就是singleTask啓動模式。
如果設置一個Activity的啓動模式爲singleTask,那麼每次啓動此Activity時系統都會檢查當前任務棧中是否已經存在此Activity的實例。如果已經存在,則不再創建此Activity新的實例,而是調用已存在的Activity的onNewIntent()方法,並把intent作爲此方法的參數傳遞給它。然後它就會被置於棧頂,並把它之前的所有的Activity移除掉。
原理實現
(我們先將進入應用的第一個Activity稱爲BaseActivity)。明白了基本原理之後就好辦了,先將BaseActivity的啓動模式設置爲singleTask,並重寫此Activity的onNewIntent()方法用來結束自己,之後會在此Activity上進入其他Activity進行數量不定的跳轉。在需要退出時只需在當前Activity上調用startActivity(this,BaseActivity.class)會首先將除BaseActivity外的所有Activity結束掉,然後會自動調用BaseActivity的onNewIntent()結束掉自己,這樣所有Activity都完美的退出了。
圖解實現
爲了便於理解,使用下圖演示此方式的具體實現過程。
代碼實現
第一步:設置BaseActivity的啓動模式爲singleTask
android:launchMode="singleTask"
第二步:重寫BaseActivity的onNewIntent()方法
//聲明一個靜態常量,用作退出BaseActivity的Tag
public static final String EXIST = "exist";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {//判斷其他Activity啓動本Activity時傳遞來的intent是否爲空
//獲取intent中對應Tag的布爾值
boolean isExist = intent.getBooleanExtra(EXIST, false);
//如果爲真則退出本Activity
if (isExist) {
this.finish();
}
}
}
第三步:在需要退出應用的Activity中啓動BaseActivity
Intent intent = new Intent(this,BaseActivity.class);
//傳遞退出所有Activity的Tag對應的布爾值爲true
intent.putExtra(BaseActivity.EXIST, true);
//啓動BaseActivity
startActivity(intent);