Android ---Activity 的啓動模式詳解

關於activity 的啓動模式還是很重要的,因爲涉及到許多跳轉問題。所以開發者需要對啓動模式有一個良好的認識 ,那麼activity的究竟有幾種啓動模式呢 首先我想嘮叨下寫博客中出現的問題。 就是進程 包括了棧 大家不要混淆。一個app啓動系統會開闢一個進程給他 而裏面的activity運行在進程裏的棧裏。

第一種 standard 

這種啓動模式 是activity的最常用的模式 ,標準啓動模式。之所以成爲標準是他最普遍。沒有特殊的地方。打開一個標準的activity,那麼就會創建對應activity的實例入當前啓動者所在的棧、不管之前有沒有創建過。舉個栗子:

當前 棧內 有一個 activity A, A 要打開   標準模式 activity B   B之前是否在Q 內存在實例都 會重新創建 B併入Q棧內。

第二種 singleTop 

singleTop 啓動模式 是一個  複用棧頂的啓動模式 ,分兩種情況 。(1)若當前棧內的棧頂是該activity,那麼複用這個實例不會重新創建。(2)若當前棧內有 activity,但是activity不在棧頂或者當前棧內沒有activity實力。都會重新創建一個activity實例入棧。那麼這兩種情況具體什麼意思? 舉個栗子:

(1)當前Q棧的activity情況  ABC  ,C在棧頂。C的lunchmode 模式爲singleTop。 這時要打開C 就不會重新創建一個C 而是複用當前已有的C 並將intent 傳入調用C 的onnewIntent ()  打開C。打開之後棧內的情況是ABC 就沒什麼變化

 (2)當前棧內activity 情況ACB   B 在棧頂  C 的lunchmode 模式爲singleTop。這時要啓動C 會重新創建一個C之後棧內情況就是 ACBC 。 如果棧內activity 情況AB   B 在棧頂  C 的lunchmode 模式爲singleTop 這時要啓動C  就和剛纔那個情況是一樣的重新創建C實例併入棧 啓動後 棧內的情況是 ABC

第三種 singleTask 

singleTask 是一種棧內複用模式 他的核心就是 在activity的要啓動的 棧 內(這裏我標紅了是因爲他會受taskAffinity 屬性影響但是核心思想就是:)---->> 查找是否存在該activity的實例若存在那麼就清除該activity上面的其他的activity 讓該activity來到棧頂 若不存在那麼重新創建。

那麼 什麼是 taskAffinity 他可以指定activity啓動的棧 。如果有這個棧就會入這個棧。如果沒有就會重新創建一個棧,這個屬性對前兩個啓動模式沒有影響只對singletask與singleinstance 有影響 

舉幾個栗子 :

(1) 沒有指定taskAffinity 棧內情況 ADBC   ,D是啓動模式爲singleTask的  這時複用已經存在的D 不會重新創建 回調D 的onnewintent() ,  那麼之後棧內的情況是 AD。

 (2)指定taskAffinity 棧內情況AB ,D 啓動 這時匯創建一個對應的taskAffinity 然後創建一個新的D入新創建的棧   所以這時有兩個棧 。 AB , D 

第四種 singleInstance 

singleinstance 是一個特殊的模式 表示activity在當前系統內只有一個實例 並且單獨一個棧 而且這個棧裏只有他自己

其他由他打開的ac 都會重新創建一個新的棧 。不會與他公用一個棧。   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章