Android生命週期注意點總結

每天一個蘋果
藝術探索第一章看完之後的總結和驗證
-
A開啟B:
onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A)
,onPause方法中不能執行耗時操作,否則影響顯示效果。 -
在
onRestoreInstanceState
中恢復Bundle中資料和onCreate
中恢復的區別,onRestoreInstanceState
被呼叫,Bundle
一定不為空,而onCreate
中傳入的Bundle
可能為空。 -
onSaveInstance
呼叫的前提是,這個Activity還會被顯示,如果正常銷燬是不會呼叫這個方法,就像正常啟動不會呼叫onRestoreInstanceState
一樣。 -
當裝置配置發生改變的時候,Activity預設會被重建,可以通過在XML中指定
configChanges
來阻止這種重建,比較常見的有螢幕旋轉。變化發生時候,onConfigurationChange
將被呼叫。 -
用標準模式啟動Activity,如果傳入的
非Activity型別的Context
,將報錯。因為標準模式下,新的Activity要放到啟動它的Activity的任務棧中,而這種Context
沒有任務棧,所以會報錯,解決方法,在啟動的時候指定FLAG = FLAG_ACTIVITY_NEW_TASK
。 -
如何理解
FLAG_NEW_ACTIVITY_TASK
是一種SingleTask
模式啟動? 我的理解是,SingleTask
是棧內複用,保證棧中只有一個例項。而指定FLAG_NEW_ACTIVITY_TASK
會自己建立棧,當然只有一個例項。 -
SingleTop
模式下,A在棧頂呼叫自己。可見下圖。即使是複用,也是會先Pause自己,再Resume自己的。中間呼叫onNewIntent
image.png
-
SingleTask(A)呼叫standard(B),再在B中呼叫A
。從下面的生命週期可以看見,第二次開啟A的時候,先呼叫了A的onNewIntent
再執行了A的Restart和Start
等方法,並且B被銷燬了。看劃線處
-
SingleInstance
模式下,整個應用只會建立一個例項,並且有自己獨立的棧。除非這裡例項被銷燬,否則不會建立例項。 -
前臺任務棧
BA
,後臺任務棧DC
,B
啟動D
的時候,棧變成DCBA
,啟動C
的時候變成了CBA
,此時D被銷燬。 -
任務棧,引數
TaskAffinity
作為任務棧的識別符號,可以在manifest.xml
中指定。任務棧分為前臺任務棧
和後臺任務棧
。也就是問題9中情況。預設的這個引數是包名。 -
boolean allowTaskReparenting = true
時候。這個啟動情況我相信大家都遇到過。別人把JD上的商品分享給你,你點開連線,會自動開啟JD APP
中展示這個商品頁面,此時返回Home
,再去開啟JD APP
。不會啟動京東的主Activity
,而是啟動剛才那個頁面。如果按back鍵,那麼直接退出JD了。 -
程式碼中指定啟動模式的優先順序比XML中定義要高。就像顯示
Intent
比隱式intent
優先順序高一樣。 -
一個activity可以有多個匹配規則
<intent-filter>
,每個規則中有多個action
,多個category
,和若干data
。
-
intent有且僅有一個
ACTION
,並且必須和filter匹配。可以檢視原始碼,mAction
是一個String
型別的。intent
的action
不能有多個否則會覆蓋。image.png
-
Category(Intent)
是Category(intent-filter)
的子集。 -
data
和ACTION
匹配規則一樣image.png