一、Activity
1、Activity生命周期

- 正常情況
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
onCreate:Activity創(chuàng)建,初始化資源或者異常處理。
onStart:Activity已經(jīng)可見,但是還沒顯示到前臺,無法與用戶交互。
onResume:Activity顯示到前臺,可以與用戶交互。
onPause:Activity無法與用戶交互,但是此時還能看見,例如打開了一個透明主題的Activity。
onStop:不可見,位于后臺,無法與用戶交互。
onDestory:Activity銷毀。 - 生命周期的幾種情況
(1):onRestart何時調(diào)用:Activty由不可見變?yōu)榭梢姇r。
按下Home鍵重新打開Activity:onRestart->onStart->onResume
A啟動B后,退回A,同上。
(2):onPause與onStop肯定會一起調(diào)用嗎?不一定,當(dāng)打開的的Activty是透明的時,只會調(diào)用onPause。
A打開B時,二者的生命周期順序為:
onPause->onCreate->onStart->onResume->onStop
也就是說A的onPause會在B顯示出來前調(diào)用,因此不能在onPause執(zhí)行太多耗時操作,會影響新的Activity的顯示,同樣onStop也不能,會導(dǎo)致新Activity卡頓。 - 異常情況的生命周期
(1)異常情況由橫豎屏切換和內(nèi)存不足回收Activity。
可用onSaveInstanceState保存數(shù)據(jù),onRestoreInstanceState恢復(fù)數(shù)據(jù),一般不使用onCreate,因為onRestoreInstanceState一旦調(diào)用,里面肯定有數(shù)據(jù),而onCreate需要判斷是否為空。
(2)onSaveInstanceState與onRestoreInstanceState不會成對調(diào)用。
onSaveInstanceState調(diào)用時機:按下Home,按下Memu選擇別的程序,啟動別的Activity,按下電源鍵,橫豎屏切換等,注意按Back鍵或者finish等用戶主動關(guān)閉不會調(diào)用。
onRestoreInstanceState調(diào)用時機:異常情況被系統(tǒng)關(guān)閉才會調(diào)用,例如橫豎屏切換,生命周期為:
onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume
2、啟動模式及其應(yīng)用場景
啟動模式4種:standard,singleTop,singelTask,singleInstance。
- onNewIntent的調(diào)用時機
(1)singleTop模式的Activity, 僅當(dāng)該Activity已經(jīng)在Task的頂部了, 才會復(fù)用.
復(fù)用生命周期:onPause->onNewIntent->onResume
(2) singleTask模式的Activity, 同一個Task中只會存在一個實例. 如果Task中還沒有, 則新建, 放在Task頂部; 如果Task中已經(jīng)有該Activity實例, 回退上面所有的Activity,然后復(fù)用該Activity.
singleTask模式的Activity的復(fù)用模式:
如果已經(jīng)在Task頂部, 如同singleTop的復(fù)用模式;
如果不在Task頂部, 則銷毀Task中該Activity頂部的所有其他Activity, 通過onNewIntent喚起該Activity, 走onRestart流程,即:
onNewIntent->onRestart->onStart-onResume. - 應(yīng)用場景
通知欄的通知/消息使用singleTop,因為消息推送可能有多條,點擊進去是一個詳情頁,詳情頁一般是同一個Activity,不能點擊多次就打開多個Activty。
MainActivity一般使用使用singleTask,MainActivty一般是在棧底,用戶希望返回MainActivity后再點擊Back就能退出應(yīng)用。
http://www.itdecent.cn/p/c97688eb5056
二、Fragment
1、Fragment生命周期

與Activity不同的地方是:
(1)onAttach():回調(diào)將在Fragment與其Activity關(guān)聯(lián)之后調(diào)用,可以得到Activity的引。
(2)onCreate():創(chuàng)建實例
(3)onCreateView():創(chuàng)建Fragment視圖
(4)onActivityCreate():Activity中onCreate回調(diào)
與Activity的通信、與Fragment的通信
SharePreference相關(guān)
1、SharePreference為什么進程間通信不是安全的?
SharePreference中新建時可以指定加載模式是MODE_MULTI_PROCESS,用來支持多進程使用,但是無法做到多進程同步更新。SharePreference首次加載時會把所有內(nèi)容從磁盤加載進內(nèi)存,以后讀取直接從內(nèi)存中讀取,修改后提交事務(wù)則會把內(nèi)容先寫進內(nèi)存,然后寫進磁盤。MODE_MULTI_PROCESS的作用只是說當(dāng)調(diào)用getSharedPreferences()時即使內(nèi)存中存在緩存也會從磁盤中獲取,之后還是從緩存中獲取數(shù)據(jù)。即使每次獲取內(nèi)容都調(diào)用getSharedPreferences()直接從磁盤讀取數(shù)據(jù),也不是同步的,因為Android原生的文件訪問并不支持多進程互斥,也就是可能一個進程正在寫數(shù)據(jù),一個進程讀數(shù)據(jù),那么得到的數(shù)據(jù)可能是臟數(shù)據(jù),這個問題也無法同個加鎖來解決,因為進程間無法共享內(nèi)存,實際上是兩把鎖。
2、commit和apply的區(qū)別
commit和apply都是提交事務(wù),先把內(nèi)容更新到內(nèi)存中,在寫入到磁盤中。不同的是commit是在當(dāng)前線程中執(zhí)行,而apply在當(dāng)前線程寫入內(nèi)存緩存,然后在線程中把內(nèi)容寫進磁盤中。所以不要在主線程中執(zhí)行commit操作。
https://zhuanlan.zhihu.com/p/22913991
http://www.itdecent.cn/p/4984f66f9a4b
線程執(zhí)行相關(guān)
1、多個線程如何順序執(zhí)行
https://blog.csdn.net/quliangmao/article/details/78666417
2、線程打印AB,多個線程執(zhí)行如何確保打印出AA...BB
http://www.itdecent.cn/writer#/notebooks/25326932/notes/28629104/preview
3、多線程交替打印ABC
https://blog.csdn.net/xiaokang123456kao/article/details/77331878