眾所周知,當我們多次啟動同乙個activity時,會建立多個該activity的例項,系統會按照先進後出的原則,將它們一一放進任務棧中,然後我們按back鍵,系統就會將棧頂的activity移除棧,直至棧中沒有activity,系統就會**這個任務棧。這就是預設的activity啟動模式:standard模式。在該模式下,每次啟動activity都會建立乙個新的例項,不利於記憶體的利用,這種做法顯然不合理,為了優化這個問題,android提供4種activity啟動模式,在不同的情況下選擇不同的復用機制避免出現例項重複建立問題。
進入正題,acticity的啟動模式如下:
standard、singletop、singletask、singleinstance
1、standard(標準模式)
這是系統的預設啟動模式,不管這個activity的例項是否存在於任務棧中或者和啟動它的activity是否在相同的任務棧中,每次啟動activity都會建立乙個新的例項。這樣建立的activity會依次執行oncreate、onstart、onresume生命週期方法。這種情況下,誰啟動了它,它就屬於啟動它的activity的任務棧中,例如mainactivity啟動mainactivity2,mainactivity2就會位於mainactivity所在任務棧的棧頂。具體檢視日誌的方法如下:adb shell dumpsys activity ,我們只看 running activities (most recent first): 部分。
running activities (most recent first):說明 main2activity 和 mainactivity 位於相同的棧:#2748,並且 main2activity 位於棧頂。taskrecord
run #12: activityrecord
run #11: activityrecord
2、singletop(棧頂復用模式)
這個模式下,如果activity的例項已經存在在棧頂,啟動它就不會再建立新的例項,而是會呼叫onnewintent,通過此方法的引數我們可以去除當前請求的資訊。隨後會呼叫onresume方法,不再呼叫oncreate、onstart方法,因為它沒有變化。如果沒有存在的話,就會如同standard模式一樣。這種模式可以用來防止多次開啟同乙個activity。
對於以上的兩種模式總結下:
standard和singletop啟動模式都是在原任務棧中新建activity例項,不會啟動新的task,即使你指定了taskaffinity屬性。taskaffinity屬性標識了乙個activity所需任務棧的名字,預設情況下,所有activity所需的任務棧的名字為應用的包名。重要的是即使設定了taskaffinity屬性,對standard和singletop模式不會有任何影響,這兩種啟動模式下不會建立新的task。
3、singletask(棧內復用模式)
在這個模式下,如果棧內存在該activity的例項,不管是否存在於棧頂都不會再建立例項,而是會將該例項前的activity清出棧頂(cleantop),並且會**onnewintent方法。其實在這個過程中,首先是會進行任務棧的匹配,這個任務棧就是通過taskaffinity屬性指定,如果不存在這個任務棧,就會建立乙個任務棧,並將該activity放入棧中。流程圖比較清晰,如下所見:
4、singleinstance(全域性唯一模式)
該模式具備singletask模式的所有特性外,與它的區別就是,這種模式下的activity會單獨占用乙個task棧,具有全域性唯一性,即整個系統中就這麼乙個例項,由於棧內復用的特性,後續的請求均不會建立新的activity例項,除非這個特殊的任務棧被銷毀了。以singleinstance模式啟動的activity在整個系統中是單例的,如果在啟動這樣的activiyt時,已經存在了乙個例項,那麼會把它所在的任務排程到前台,重用這個例項。
深入理解 Oracle 啟動原理
當oracle啟動時,初始化引數檔案的載入順序為 spfilesid.ora spfile.ora initsid.ora 資料庫處於shutdown狀態 資料庫處於停止狀態。不能接受外界資料請求。使用作業系統命令ps ef grep ora看不到任何資料庫程序的存在,啟動指令碼問dbstart 資...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...