文章轉自:http://blog.csdn.net/vipzjyno1/article/details/25463457
1.什麼是棧
棧
棧是一種常用的數據結構,棧只允許訪問棧頂的元素,棧就像一個杯子,每次都只能取杯子頂上的東西,而對於棧就只能每次訪問它的棧頂元素,從而可以達到保護棧頂元素以下的其他元素.”先進後出”或”後進先出”就是棧的一大特點,先進棧的元素總是要等到後進棧的元素出棧以後才能出棧.遞歸就是利用到了系統棧,暫時保存臨時結果,對臨時結果進行保護.
</pre><pre id="best-content-1325062230" class="best-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word; line-height: 24px; background-color: rgb(255, 255, 255); margin-top: 0px; margin-bottom: 10px; padding: 0px; "><h2 style="margin: 0px; padding: 0px; font-family: arial, 'courier new', courier, 宋體, monospace; "><a target=_blank name="t2" style="color: rgb(255, 153, 0); "></a><span style="font-size: 18px; ">定義棧(Stack)</span></h2><span style="color: rgb(51, 51, 51); font-family: arial, 'courier new', courier, 宋體, monospace; "><strong>棧的定義棧(Stack)是限制僅在表的一端進行插入和刪除運算的線性表。(1)通常稱插入、刪除的這一端爲棧頂(Top),另一端稱爲棧底(Bottom)。 (2)當表中沒有元素時稱爲空棧。(3)棧爲後進先出(Last In First Out)的線性表,簡稱爲LIFO表。棧的修改是按後進先出的原則進行。每次刪除(退棧)的總是當前棧中"最新"的元素,即最後插入(進棧)的元素,而最先插入的是被放在棧的底部,要到最後才能刪除。</strong></span>
<span style="font-family: arial, 'courier new', courier, 宋體, monospace; color: rgb(51, 51, 51); "><strong> </strong></span><h2 style="margin: 0px; padding: 0px; font-family: arial, 'courier new', courier, 宋體, monospace; "><a target=_blank name="t3" style="color: rgb(255, 153, 0); "></a><span style="font-size: 18px; ">棧的操作</span><span style="font-size: 14px; color: rgb(51, 51, 51); ">:壓棧、彈棧 </span></h2><div style="color: rgb(51, 51, 51); font-weight: bold; font-family: arial, 'courier new', courier, 宋體, monospace; "> </div><h1 style="margin: 0px; padding: 0px; "><a target=_blank name="t4" style="color: rgb(255, 153, 0); "></a><span style="font-family: KaiTi_GB2312; font-size: 24px; ">2.Activity中的棧</span></h1><div><span style="font-family: KaiTi_GB2312; font-size: 24px; "> </span></div>
Android的管理主要是通過Activity棧來進行,當一個Activity啓動時,系統會根據其配置將它壓入到一個特定的棧中,系統處於運行狀態。當用戶點擊返回或則FINISH()了該Activity,那麼它便會被從棧中壓出,隨之摧毀,按照Activity的生命週期可以知道,如果當前顯示的棧中Activity沒有被摧毀,那麼打開新的Activity時候,會將新打開的壓入到棧,原來的根據其顯示情況選擇狀態變化(原Activity依舊可見,變爲暫停狀態(Paused),如果被完成遮住了,轉變爲停止狀態(Stopped))。
</pre><pre id="best-content-1325062230" class="best-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-family: arial, 'courier new', courier, 宋體, monospace; font-weight: bold; line-height: 24px; background-color: rgb(255, 255, 255); margin-top: 0px; margin-bottom: 10px; padding: 0px; ">
</pre><pre id="best-content-1325062230" class="best-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word; color: rgb(51, 51, 51); font-family: arial, 'courier new', courier, 宋體, monospace; font-weight: bold; line-height: 24px; background-color: rgb(255, 255, 255); margin-top: 0px; margin-bottom: 10px; padding: 0px; ">
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名。