今天一樣接續昨天的話題,來深入了解activity的各種callback,一樣參考官網。
先來解答ㄧ些昨天的問題吧:
以中文的邏輯來看,resume是恢復的意思,所以第一次打開APP,不應該叫做恢復才對。我不確定對英語系國家的人來看是不是沒這種問題,不過官網的解釋是,Created State和Started State都是快速完成且不會停留,真正會停留的是Resumed State。
然後APP就會一直停留在Resumed State,直到有其他事件發生,例如接到電話、轉換activity,螢幕旋轉或關閉等。
我想這一樣是中文邏輯的問題,打開APP之後再按Home鍵這個動作,只是讓APP進入背景執行,所以說它是pause(暫停)合理,但說它是stop(停止)就有點太強烈了。
Pause和stop的差別,官網的定義是visibility,如果APP還可以被看見,但不是正在focus的(例如多視窗系統),就是pause;如果看不見就是stop。
另外,onPause()執行的時間很短,所以實作必須簡潔,ㄧ些costly的行為應該在onStop()實作才對。
Paused State是可以停留的,直到APP真的看不見才會轉成Stopped State。
Stopped State時,因為APP看不見了,所以某些資源可以先釋放掉。會設計分成Paused State和Stopped State,應該是為了把UI功能和底層功能切開,所以適當的釋放資源是必要的。
Stopped State時,activity物件還是在記憶體中(但不在window manager中),所以當APP回到Resumed State時,已經建立過的component或layout view物件不用重新建立。
Destroy聽起來很嚴重啊,只是旋轉個螢幕有必要這樣?官網的解釋是,有兩種情況會呼叫onDestroy():
- APP真的被關掉
- Config發生變化
不過在第二種情況,Config發生變化時,系統會馬上建立一個新的activity物件。
根據官網的說明,Bundle是用來處理process間資料傳遞的,像是IPC/Binder transactions,或是帶有intent的activity之間的傳輸,或是當config變化時儲存資料。關於bundle有很多東西需要釐清,明天繼續吧!