1.activity
1.1.activity的生命週期:
oncreate onstart onresume onpause onstop onrestart onDestory
1.1.1 用戶與activity交互時,生命週期函數的調用流程:
1.啓動Activity:系統會先調用onCreate方法,然後調用onStart方法,最後調用onResume,Activity進入運行狀態。
2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。
3.當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會調用onResume方法,再次進入運行狀態。
4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居後臺:系統會先調用onPause方法,然後調用onStop方法,進入停滯狀態。
5.用戶後退回到此Activity:系統會先調用onRestart方法,然後調用onStart方法,最後調用onResume方法,再次進入運行狀態。
6.當前Activity處於被覆蓋狀態或者後臺不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,而後用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。
7.用戶退出當前Activity:系統先調用onPause方法,然後調用onStop方法,最後調用onDestory方法,結束當前Activity。
8、橫豎屏幕切換時候activity的生命週期
①不設置activity的Android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,且豎屏時會執行兩次
②設置activity的android:configChanges=”orientation"時,切屏還是會調用各個生命週期,切橫屏,豎屏時只會執行一次
③設置activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
思考題:
當activity A跳轉到activity B,這個時候會調用A生命週期的哪些函數?會調用B生命週期的哪些函數?
A:onPause B:onResume
特別的,以上問題中,A和B被調用所有函數的先後順序是?
先A 後B
接上問題,如果B關閉後返回A,這個時候會調用A生命週期的哪些函數?會調用B生命週期的哪些函數?A和B被調用所有函數的先後順序是?
A: onResume B:onPasuse onDestory
1.1.2 activity的4種啓動方式 android:launchmode
1.standard 默認模式,每次新建一個實例
使用場景:程序內普通子頁面
2.singleTop 允許多個實例,同一個應用程序允許多個activity,如果存在相同activity在棧頂,則調用上一個的onNewInstance()方法
如 B是singleTop: A-B-B : A-B-調用B的onNewInstance
A-B-A-B: A-B-A-B
使用場景:新聞類的通知頁面,比如有10個通知,不需要每次點進去都是一個activity
3.singleTask 只有一個實例, 同一個應用程序中如果不存在,則新建,如果存在 則destory 之前那個activity之上的其他activity
如B是singleTask: A-B-C-B-A-B-C-A 過程是 A-B-C: A-B-C A-B-C-B: A-B A-B-C-B-A: A-B-A A-B-C-B-A-B:A-B A-B-C-B-A-B-C-A :A-B-C-A
使用場景:程序的主界面,整個程序中只有各一個實例,只有一個主界面,如果有多個,則跳轉到之前的onNewInstance方法
4.singleInstance 只有一個實例,並且該task中只有一個實例
A-B-C 如果A是taskid 200 ,則會new task b,然後 C 是taskid 201
使用場景:鬧鐘鈴聲通知適合與程序分離的頁面
注意:
當使用Launch Mode 來改變系統默認的任務調度的時候,如果是用到Single Task或者Single Instance的時候,還要注意到Affinity的使用,要跟Affinity配合使用,可能才能達到我們期望中的效果。而Affinity,其實是Android提供的一個表從屬意義的參數,類似於一個Tag值,它表明當前Activity屬於哪一個Tag,相當的Affinity值的Activity,如果不使用其他的標誌,如Single Instance之類,那麼都會在存在於同一個task中。一般情況下,我們並不定義Task Affinity值,則其默認的值就是當前App的包名。