Android的activity有4種啓動模式,但要理解啓動模式就不得不先理解安卓的任務棧概念。android
1、任務棧數據結構
每一個安卓APP啓動時都會建立至少一個空的任務棧來存儲衆多的Activity,任務棧實際上和數據結構裏的棧結構是同樣的「先進後出」結構,用戶看到的頁面都是位於任務棧最上方的那個Activity加載的頁面。默認狀況下,也就是用戶不設置的狀況下,activity的啓動方式是Standard模式。下面咱們開始聊第一個啓動模式。app
2、啓動模式spa
1、standard模式xml
standard模式容許一個任務棧中存放重複的Activity,每跳轉或者建立一個新的activity都會生成一個新的activity覆蓋在棧頂端讓用戶看到。當返回頁面時最上端的彈出棧外銷燬掉,用戶看到的是第二個頁面,不斷按返回鍵時,依次彈出棧外,最後空棧也會被回收掉。內存
(1)舉例說明:A、B、C三個頁面按左邊進入棧內,跳轉到A馬上生成Activity覆蓋在上面。string
(2)假設C已經在棧頂,此時跳轉到C的情形。it
這種模式的缺點也看出來了,若是有個頁面重複被顯示的話,那麼用戶按下返回鍵時很奇怪,怎麼剛剛纔關掉了C頁面,怎麼又出現了呢?所以有必要修改模式或者離開某個頁面就關掉它。io
2、singleTop模式。也容許出現重複的活動實例,分爲兩種狀況,頁面不在棧頂和頁面已經在棧頂的狀況。方法
(1)頁面不在棧頂。此時仍是和standard同樣從新生成一個新的activity實例。
(2)頁面在棧頂。此時直接使用棧頂的這個活動實例,不會從新生成新的。
三.singleTask模式。不會出現重複的活動實例,這種模式下至於兩種情形,棧內有這個活動的實例的情形和棧內沒有這個實例的情形。
(1)假設站內原來有A、B兩個實例,此時跳轉到A頁面,無論A頁面位不位於棧頂,只要棧內存在A活動的實例,那麼就把A以上的實例所有銷燬出棧,總之讓A位於棧頂獲得用戶觀看。
(2)假設棧內沒有C,此時跳轉到C頁面,會建立新的C活動實例。
4、singleInstance模式。不會出現重複的活動實例,此時比較特殊,持有這種模式的活動實例單獨有一個棧來存儲它,棧內只有它一個實例,若是多個應用啓動這個活動,那麼他們共同享用這個棧內的惟一實例,不會生成新的。這個模式的應用好比說手機的鎖屏頁面。
這種模式的返回模式,出棧順序是C-B-A,入棧順序是A-B-C,最早出現,最後死亡,活得最長久的人,哈哈。
下面說說怎麼設定這四種模式,有兩種方法,一種是在android的manifest.xml文件中設置。
<</span>activity android:name=".Activity1"
android:launchMode="standard"
android:label="@string/app_name">
<</span>intent-filter>
<</span>action android:name="android.intent.action.MAIN" />
<</span>category android:name="android.intent.category.LAUNCHER" />
</</span>intent-filter>
</</span>activity
另外一種是在啓動意圖時設置,intent.FLAG_ACTIVITY_SINGLE_TOP.這裏不作詳細講述。
FLAG_ACTIVITY_SINGLE_TOP
這個FLAG就至關於加載模式中的singletop,好比說原來棧中狀況是A,B,C,D在D中啓動D,棧中的狀況仍是A,B,C,D
FLAG_ACTIVITY_CLEAR_TOP
這個FLAG就至關於加載模式中的SingleTask,這種FLAG啓動的Activity會把要啓動的Activity之上的Activity所有彈出棧空間。類如:原來棧中的狀況是A,B,C,D這個時候從D中跳轉到B,這個時候棧中的狀況就是A,B了.