天天看點

從注冊流程 分析如何安全退出多個Activity 多種方式(附DEMO)前言知識結構具體方案總結源碼DEMO

由于一個同學問到我如何按照一個流程走好之後回到首頁,我以前看到過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是最可行的方法,如有什麼錯誤之處,望大家提出,馬上改正。

從注冊流程 分析如何安全退出多個Activity 多種方式(附DEMO)前言知識結構具體方案總結源碼DEMO

最後附上源碼:   

(以上方式中都已經講到了對應的方法和代碼,源碼可以更好的幫助你去體驗下這幾種方式的使用流程)