一鍵退出App所有方式

該文章參考了Carson_Ho(https://juejin.im/post/5a4ae66d518825390e348aac)博主的文章,如有侵權請通知刪除

在安卓面試過程中經常會被問到如何從一個Activity中退出整個App的問題,下面我就總結一下如何回答該問題。

重點:退出整個App有兩個步驟,第一步驟是關閉所有的Activity,第二步驟是退出這個App進程。

第一種:創建存放所有Activity的集合進行遍歷退出

1.寫一個基類BaseActivity,讓你所創建的Activity都繼承與它,在該基類中定義一個LinkedList(因爲    		
應用場景是增刪次數多,所以此處用鏈表),在每個onCreate方法中將自身的Activity添加add進該鏈
表中,其次在每個onDestory中再刪除remove自身的Activity即可,然後再BaseActivity中些一個清空刪
除所有Activity並退出進程的方法,當你想退出整個App的時候調用這個方法即可。
2.寫一個Application的子類讓它在onActivityCreated方法中添加每一個activity到鏈表中,然後在其中	
寫一個退出App的方法,當想退出的時候,調用該方法即可,記得在Manifest文件中添加這個	
application。

優點:應用場景廣泛:兼顧單 / 多任務棧 & 多啓動模式的情況
缺點:需要 Activity 經歷正常的生命週期,即創建時調用onCreate(),結束時調用onDestroy()
因爲只有這樣經歷正常的生命週期才能將 Activity正確寫入 & 寫出 容器內
應用場景:任意情況下的一鍵退出 App 實現

第二種:RxBus

使用 RxBus當作事件總線,在每個 Activity裏註冊RxBus訂閱(響應動作 = 關閉自身);當需要退出
App時 發送退出事件請求即可。

優點:可與 RxJava & RxBus 相結合
缺點:實現複雜:RxBus  本身的實現難度 & 需要在每個Activity註冊和取消訂閱 RxBus 使用
應用場景:需要與RxJava 結合使用時
若項目中沒有用到RxJava & RxBus 不建議使用
注:上述方法僅僅只是結束當前App所有的Activity (在用戶的角度確實是退出了 App),但實際上該App的進程還未結束

第三種:通過 Android 組件: BroadcastReceiver

在每個 Activity 裏註冊廣播接收器(響應動作 = 關閉自身);當需要退出 App 時 發送廣播請求即可

優點:應用場景廣泛:兼顧單 / 多任務棧 & 多啓動模式的情況
缺點:實現複雜:需要在每個 Activity 裏註冊廣播接收器
應用場景:任意情況下的一鍵退出 App,但無法終止 App 進程

第四種:通過Activity的SingleTask啓動模式

在Manifest文件中修改Activity啓動模式,記住棧底的那個Activity,在Activity中重寫onNewIntent方
法,裏面增加一個退出整個App的標識符判斷,再寫一個退出App的方法,然後想退出的時候將
Activity跳轉到棧底的那個Activity然後創建並啓動退出App的意圖,然後結束進程即可。

優點:使用簡單 & 方便
缺點:規定 App的入口Activity採用SingleTask啓動模式
使用範圍侷限:只能結束當前任務棧的Activity,若出現多任務棧(即採用SingleInstance啓動模式)	
則無法處理
應用場景:Activity單任務棧

第五種:通過Activity的兩個flag標識符

原理:對入口Activity採用 2 標記位:
Intent.FLAG_ACTIVITY_CLEAR_TOP:銷燬目標Activity和它之上的所有Activity,重新創建目標Activity
Intent.FLAG_ACTIVITY_SINGLE_TOP:若啓動的Activity位於任務棧棧頂,那麼此Activity的實例就不會重建,而是重用棧頂的實例( 調用onNewIntent())
記住棧底的那個Activity,在Activity中重寫onNewIntent方法,裏面增加一個退出整個App的標識符判
斷,當想退出App的時候,創建一個Intent,並且set上面兩個flag,其次再put一個退出整個App的標識
符即可。

優點 使用簡單 & 方便
缺點:使用範圍侷限:只能結束當前任務棧的Activity,若出現多任務棧(即採用SingleInstance啓動	
模式)則無法處理
應用場景:Activity單任務棧

第六種:通過系統任務棧

通過 ActivityManager 獲取當前系統的任務棧 & 把棧內所有Activity逐個退出,然後退出進程。

優點:使用簡單、方便
缺點:使用範圍侷限:只能結束當前任務棧的Activity,若出現多任務棧(即採用SingleInstanc啓動模
式)則無法處理
對 Android 版本要求較高:Android 5.0以上
應用場景:Android 5.0以上的 Activity單任務棧

至於退出進程的話,有兩種方法

// 方式1:android.os.Process.killProcess()
android.os.Process.killProcess(android.os.Process.myPid()) ;

// 方式2:System.exit()
// System.exit() = Java中結束進程的方法:關閉當前JVM虛擬機
System.exit(0);  

// System.exit(0)和System.exit(1)的區別
// 1. System.exit(0):正常退出;
// 2. System.exit(1):非正常退出,通常這種退出方式應該放在catch塊中。 

特別注意
假設場景:當前 Activity ≠ 當前任務棧最後1個Activity時,調用上述兩個方法會出現什麼情況呢?(即Activity1 - Activity2 -Activity3(在Activity3調用上述兩個方法))

答:
結束Activity3(當前 Activity )& 結束進程
再次重新開啓進程 & 啓動 Activity1 、 Activity2

即在Android 中,調用上述Dalvik VM本地方法結果是:

1.結束當前 Activity & 結束進程
2.之後再重新開啓進程 & 啓動 之前除當前 Activity 外的已啓動的 Activity

原因:** Android中的ActivityManager時刻監聽着進程**。一旦發現進程被非正常結束,它將會試圖去重啓這個進程。

應用場景
當任務棧只剩下當前Activity(即退出了其餘 Activity後),調用即可退出該進程,即在(步驟1)結束當前 App 所有的 Activity 後,調用該方法即可一鍵退出App(更多體現在結束進程上)

注: 與 “在最後一個Activity調用 finish()”的區別:finish()不會結束進程,而上述兩個方法會
在這裏插入圖片描述
至此所有方法差不多已經完成了,如果要具體查看每種方法的實例,請查看最上方給出的原博主地址(內附Demo)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章