深入Activity,Activity啓動模式LaunchMode完全解析

轉載請註明出處:http://blog.csdn.net/linglongxin24/article/details/53221384
本文出自【DylanAndroid的博客】


深入Activity,Activity啓動模式LaunchMode完全解析

在平時的開發中,我們可能會瞭解到Activity的任務棧還有Activity的啓動模式。那麼Activity的啓動模式都分別是怎麼樣的呢?如果設置了這些啓動模式對任務棧有事麼影響
,還有就是這麼啓動模式在實際的開發中有什麼應用呢?這裏用圖例和demo來分析一下Activity的啓動模式。

Demo圖

1.Standard:標準啓動模式

Activity的默認模式,所有的Activity元素遵循先進後出的進棧出棧的特性,這種的比較簡單

啓動順序:A->B->C

回退順序:C->B->A.

Standard

2.SingleTop:棧頂複用模式

棧頂複用模式,如果想要打開的activity在任務棧的棧頂已經存在,就不會創重新建新的實例,而是調用該Activity的 onNewIntent() 方法。避免棧頂的activity被重複的創建。

例如A.B啓動模式爲Standard,C啓動模式爲SingleTop

啓動順序:A->B->C—>C

回退順序:C->B->A.而不是C->C->B->A

SingleTop
應用如下:
* 點擊通知欄重複打開Activity的問題
全新的Android通知欄,已拋棄setLatestEventInfo,兼容高版本 這篇文章裏面
我們打開一個通知欄,點擊通知欄默認打開MainActivity,有一個問題,就是如果不設置MainActivity的launchMode,就會每次點擊通知欄的時候會重新打開一個Activity。
我們可以將MainActivity的啓動模式設置爲SingleInstance,就不會再重新打開MainActivity,而是調用MainActivity的onNewIntent() 方法。
* 可以解決按鈕重複點擊的問題(當然這種啓動模式不是爲了去解決這個問題在這裏這是說爲了用這麼應用去說明SingleTop啓動模式)。

3.SingleTask:棧內複用模式

如果想要啓動的Activity在當前棧內啓動之後,該activity只會在任務棧裏面存在一個實例。如果要再次打開這個activity,在任務棧裏面如果已經存在,就不會創建新的activity,
而是複用棧內的這個已經存在的activity,調用改Activity的 onNewIntent() 方法,並且清空這個activity任務棧上面所有的activity。

例如A.C.D啓動模式爲Standard,B啓動模式爲SingleTask

啓動順序:A->B->C—>D—>B

回退順序:B->A.而不是B—>D->C->B->A

SingleTop
應用如下:如果從主頁去登錄,然後去註冊,註冊完成如果直接回去主頁,可以將主頁的launchMode設置爲SingleTask。直接從註冊跳到主頁即可,不用去關心LoginActivity是否關閉,還是什麼時候關閉。

4.SingleInstance:單一實例模式

在整個Android系統中(可能會有很多任務棧)裏面只有一個實例存在。不同的應用程序app去啓動這個activity,就會共享公用同一個activity。
他會運行在自己單獨的的任務棧裏面,並且這個單獨的任務棧裏面只會存在着一個實例。而且這個單獨的任務棧會在最底層。
應用場景:系統的發短信,打電話,來電,瀏覽器等。這種模式在平時很少去使用,一般在Launcher中可能會用到。

例如A.C啓動模式爲Standard,B啓動模式爲SingleInstance

啓動順序:A->B->C;注意:此時產生了兩個任務棧,B產生了一個新的任務棧,並處於其他任務棧的下面。

回退順序:C->A->B.而不是C->B->A

SingleTop

5.GitHub

發佈了134 篇原創文章 · 獲贊 73 · 訪問量 63萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章