關於退出全部Activity,目前網上比較流行的方式大概有如下幾種:html
① 使用ActivityManager的方式;android
② 自定義一個Activity集合類的方式;ide
③ 經過發送廣播的方式;this
④ 經過殺死當前應用進程的方式;url
以上方式的具體實現你們可自行谷歌百度,此處再也不贅述。spa
可是這些方式要麼不太靠譜,要麼有限制,要麼不夠優雅。今天咱們就來講一個簡單有效,優雅大方的方式來退出全部的Activity。code
原理htm
先來講一下原理。咱們知道,Activity有四種啓動模式,分別爲:standard(默認模式)、singleTop、singleTask、singleInstance。本方式須要使用的就是singleTask啓動模式。blog
若是設置一個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);