Android基礎(chǔ)

一、Activity

1、Activity生命周期

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生命周期

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容