678
人物
activity的啟動模式和棧管理
在學習Android的過程中,Intent是我們最常用Android用於進程內或進程間通信的機製,其底層的通信是以Binder機製實現的,在物理層則是通過共享內存的方式實現的。1.什麼是棧
棧
<span >棧是一種常用的數據結構,棧隻允許訪問棧頂的元素,棧就像一個杯子,每次都隻能取杯子頂上的東西,而對於棧就隻能每次訪問它的棧頂元素,從而可以達到保護棧頂元素以下的其他元素.”先進後出”或”後進先出”就是棧的一大特點,先進棧的元素總是要等到後進棧的元素出棧以後才能出棧.遞歸就是利用到了係統棧,暫時保存臨時結果,對臨時結果進行保護.</span>
<span > </span>
<h2 ><a target=_blank name="t2"></a><span >定義棧(Stack)</span></h2><span ><strong>棧的定義棧(Stack)是限製僅在表的一端進行插入和刪除運算的線性表。(1)通常稱插入、刪除的這一端為棧頂(Top),另一端稱為棧底(Bottom)。 (2)當表中沒有元素時稱為空棧。(3)棧為後進先出(Last In First Out)的線性表,簡稱為LIFO表。棧的修改是按後進先出的原則進行。每次刪除(退棧)的總是當前棧中"最新"的元素,即最後插入(進棧)的元素,而最先插入的是被放在棧的底部,要到最後才能刪除。</strong></span>
<span ><span ><strong> </strong></span></span><h2 ><a target=_blank name="t3"></a><span >棧的操作</span><span >:壓棧、彈棧 </span></h2><div > </div><h1><a target=_blank name="t4"></a><span >2.Activity中的棧</span></h1><div><span > </span></div>
Android的管理主要是通過Activity棧來進行,當一個Activity啟動時,係統會根據其配置將它壓入到一個特定的棧中,係統處於運行狀態。當用戶點擊返回或則FINISH()了該Activity,那麼它便會被從棧中壓出,隨之摧毀,按照Activity的生命周期可以知道,如果當前顯示的棧中Activity沒有被摧毀,那麼打開新的Activity時候,會將新打開的壓入到棧,原來的根據其顯示情況選擇狀態變化(原Activity依舊可見,變為暫停狀態(Paused),如果被完成遮住了,轉變為停止狀態(Stopped))。
3.Task
4.Activity啟動模式
"singleTop"
"singleTask"
"singleInstance"
以下舉例說明它們的區別:
standard:Activity的默認加載方法,該方法會通過跳轉到一個新的activity,同時將該實例壓入到棧中(不管該activity是否已經存在在Task棧中,都是采用new操作)。例如: 棧中順序是A B C D ,此時D通過Intent跳轉到A,那麼棧中結構就變成 A B C D A ,點擊返回按鈕的 顯示順序是 D C B A,依次摧毀。
singleTop:singleTop模式下,當前Activity D位於棧頂的時候,如果通過Intent跳轉到它本身的Activity (即D),那麼不會重新創建一個新的D實例,所以棧中的結構依舊為A B C D,如果跳轉到B,那麼由於B不處於棧頂,所以會新建一個B實例並壓入到棧中,結構就變成了A B C D B。
singleTask:singleTask模式下,Task棧中隻能有一個對應Activity的實例。例如:現在棧的結構為:A B C D。此時D通過Intent跳轉到B,則棧的結構變成了:A B。其中的C和D被棧彈出銷毀了,也就是說位於B之上的實例都被銷毀了。
singleInstance:singleInstance模式下,會將打開的Activity壓入一個新建的任務棧中。例如:Task棧1中結構為:A B C ,C通過Intent跳轉到了D(D的模式為singleInstance),那麼則會新建一個Task 棧2,棧1中結構依舊為A B C,棧2中結構為D,此時屏幕中顯示D,之後D通過Intent跳轉到D,棧2中不會壓入新的D,所以2個棧中的情況沒發生改變。如果D跳轉到了C,那麼就會根據C對應的launchMode的在棧1中進行對應的操作,C如果為standard,那麼D跳轉到C,棧1的結構為A B C C ,此時點擊返回按鈕,還是在C,棧1的結構變為A B C,而不會回到D。
5.Activity棧和Task聯係
6.Intent Flags
7.Activity相關屬性taskAffinity
Activity為Task擁有的一個affinity。擁有相同的affinity的Activity理論上屬於相同的Task(在用戶的角度是相同的“應用程序”)。Task的affinity是由它的根Activity決定的。
affinity決定兩件事情——Activity重新宿主的Task(參考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK標誌啟動的Activity宿主的Task。
默認情況,一個應用程序中的所有Activity都擁有相同的affinity。捏可以設定這個特性來重組它們,甚至可以把不同應用程序中定義的Activity放置到相同的Task中。為了明確Activity不宿主特定的Task,設定該特性為空的字符串。
如果這個特性沒有設置,Activity將從應用程序的設定那裏繼承下來(參考<application>元素的taskAffinity特性)。應用程序默認的affinity的名字是<manifest>元素中設定的package名。
最後更新:2017-04-03 16:49:23