由于一個同學問到我如何按照一個流程走好之後回到首頁,我以前看到過4個解決方案,後來發現有做個記錄和總結的必要,就寫了這篇博文。(之前看小強也寫過一篇,這裡通過自身的分析完整的總結一下以下6種方案,并加上一個DEMO便于大家了解大體流程)
在android的使用者互動中,按鈕觸發的意圖(Intent)跳轉會為你重新打開新的一個界面活動(Activity),對于之前的界面根據需求進行摧毀(Finish())或則保留。
如果一個互動流程中,是從A開始,按照A - B - C - D - A這樣的順序進行的話,那麼B,C,D這3個活動界面會根據你D中最後的操作來進行保留或是摧毀,例如
(1)注冊流程中,在A界面點選注冊,通過B,C,D界面完成注冊後,B,C,D就随之摧毀,而如果D中注冊不成功沒跳轉會A的話,那麼B,C,D就不能摧毀,之前所填的内容也必須保留。
(2)用戶端互動中,傳回首頁按鈕,由于在頻繁的點選打開過多的界面(如微信檢視朋友圈),傳回首頁就必須一個一個back回去,所有有的用戶端為了優化使用者體驗,便會加入一個按鈕傳回首頁(之前打開的全部關閉)。
以上幾個例子都涉及到了 --- 如何安全退出多個ACTIVITY 這個問題。
其實,這個問題的解決方案有好多種,并且各有各的優缺點,下面就羅列出多個方案以及各個方案的優缺點所在,以便使用者根據需求選擇。
首先,通過大緻的思維導圖羅列出了以下幾個知識點,來幫助你去分析學習:
1.
2.
3.Application : 全局的使用
4.Activity: onActivityResult(int requestCode, int resultCode, Intent data)方法
5.
6.BroadcastReceiver 廣播
7.棧的引申的知識點:(1)ArrayList和LinkedList的差別
(2)android 棧和隊列
以上的 (1)Activity的啟動模式 (2)intent: Flags屬性 (3)棧的概念
我通過一篇文章寫明了他們3者的聯系可以點選以下連結檢視
思路:通過Intent的Flags來控制堆棧去解決
android中,每打開一個Activity,便會在棧中加入一個Activity,當該Activity被摧毀後,棧中便移除了它,并且棧中的Activity是按照開打的先後順序依次排排列的。
Android的視窗類提供了曆史棧,我們可以通過stack的原理來巧妙的實作,這裡我們在A視窗打開B視窗時在Intent中直接加入标 志 Intent.FLAG_ACTIVITY_CLEAR_TOP,這樣開啟B時将會清除該程序空間的所有Activity。
代碼:
在注冊流程最後的FourthStep.class中,點選完成注冊點選事件
其中的 INTENT_METHOD_FIRST_SINGUP 是登入界面的Intent隐式Action。
優缺點:
優:使用對棧的巧妙利用,不會贊成記憶體無故占用等問題,個人認為這個方法是首選。
思路:通過堆棧管理器,對Stack進的存儲Activity進行操作(推入,推出,彈出)
之後在注冊流程中的對應步驟的Activity的onCreate()中把目前Activity推入棧清單,完成注冊流程後,彈出棧清單中流程所涉及的Activity。
缺:如果處理不當,容易造成不在目前界面的Activity被全局引用而摧毀不掉,記憶體得不到釋放,進而無故占用不必要的記憶體。
思路:通過在Application中用一個清單來記錄目前所打開的Activity,根據需求去周遊finish()。
描述:和方案2有點類似。
使用流程和方法2類似。
方法:使用廣播機制解決
思路:通過Activity建立的時候,設定監聽廣播,在注冊流程最後步完成注冊時候,發送廣播進行周遊finish().
描述:這裡我把這些廣播的初始化都寫在了基類BaseActivity裡面,便于維護。
在流程中的每步Activity中,初始化廣播,之後在點選完成注冊時候,發送廣播
缺:開啟過多的廣播監聽,覺得會浪費資源。
方法:通過Activity跳轉中傳遞requestCode的之後根據onActivityResult(int
requestCode, int resultCode, Intent data)中傳回的resultCode周遊關閉Activity
思路:使用startActivityForResult(intent, requestCode)方法跳轉,并且通過
描述:這裡我把這些廣播的初始化都寫在了基類BaseActivity裡面便于檢視。
之後在流程的Activity中調用帶請求碼的Intent跳轉意圖。
在最後完成注冊流程的時候通過以下方式傳回:
方法:方法有人說可以使用抛出異常來退出,可是這樣會影響到使用者體驗,是以不推薦
以上便是我從注冊流程分析如何安全退出多個ACTIVITY 的彙總總結,綜上所述,部落客覺得方案1是最可行的方法,如有什麼錯誤之處,望大家提出,馬上改正。
最後附上源碼:
(以上方式中都已經講到了對應的方法和代碼,源碼可以更好的幫助你去體驗下這幾種方式的使用流程)