∞ 前言 ∞

我相信很多教學,不管是聯成還是巨匠的老師,一開始一定都會講解這個
不過我更相信,多半剛學甚至剛聽甚至根本沒碰過的人,根本會聽的霧煞煞
因為誰會知道 Activity ,誰會懂什麼是 Fragment ,更甚至誰知道什麼是生命週期?

與其說明給初學者聽,那還不如說明應用方法給有些經驗的開發者會更有效果
當然,不能否認這還是非常重要的,所以初學者如果想要了解還是要試圖去了解
雖然我不覺得不懂的 Android 的架構,能了解 Life cycle 到什麼程度,但不能否認還是會有超強理解力的人在

但真要能夠有效運用,還是需要有些經驗

一點也不初學的 Life Cycle

其實我們要的資訊已經全在這張圖裡面了,所以初學者看不懂的話......就別懂了吧!
你只要知道你必須在 onCreate 裡塞入你所有的程式碼就好
等到你塞得出神入化之後,自然就能看得懂這張圖代表的意思了!

描述開始之補充說明:在這裡只先以 Activity 為例子

Activity Launched
 app icon launch 是同樣的道理,是 Activity 的進入點
所以這個不是重點,重點在之後
onCreate
Activity 最初被創建時所呼叫的函式,主要在建立當下 Activity 的畫面
如果你將資料獲取或計算都寫在這裡,那麼使用者體驗會遭得一塌糊塗
因為在他創建並初始化你的 UI 畫面前,他已經花了很多時間在做一些無聊的計算
所以最好不要在這裡做任何會導致 UI thread 緩慢的運算,包含在 UI thread 裡等待網路 Request
所以要嘛你多開幾條 thread 去做這些延宕 UI 畫面建立的動作,要嘛就丟到 onResume 
不過其實 Resume 只是『恢復』你 activity 的動作,也不算是可以提升效能的,頂多只能達成一些 Refresh 的效果而已
onResume
當你並非使用返回鍵而離開當下的 Activity 時,這個 Function 就是在當你回到這個 Activity 時會呼叫的
意思是恢復你暫停的 Activity 的動作,而通常有需要更新畫面的話也會在這裡去做 Refresh
只是要小心 null point 的判斷

另外會在返回這個頁面時做 Refresh  Function 除了 onResume 以外,還有另一個 onActivityResult
不過這個通常是用於 startActivityForResult 才會用來接一些資料的
onPause
這個 Function 主要是在你離開當下的 Activity 後會呼叫,使 Activity 暫停,並停止( onStop 
這邊就不討論 onStop  onReStart 的部分,在正常情況下來說,使用機率非常低,而 onReStart 的使用度又比 onStop 更低

onPause 後就接著 onStop ,然後這個 Activity 就會進入停止狀態,直到被呼叫 onDestroy 或是 onRestart 恢復
然後在 Android 的設計上,若是沒有經過 onDestroy ,卻又產生出同一個 Activity 的時候
這就會有非常高的機會造成 Memory Leak ,然後 Out of Memory
不過也是有其它方法可以避免,只要在 Intent 上添加一些 Flag 即可,讓他們可以自行呼叫前一個或其它暫停的 Activity  onDestroy ,這樣就能釋放掉一些被抓住的 Memory
onDestroy
一個生命週期的結束,會將 Activity 銷毀,同時釋放一些記憶體,但若是你在這個 Activity 呼叫了其他 class ,並將此 Activity 裡的參數或是直或是其他類別傳過去,就會導致 onDestroy 無法將你這個 Activity 完全釋放,而這個 Activity 就被其他的 class 所綁住,這也是造成 Memory Leak 的原因之一

所以我們要在這個 Function 被呼叫時,將一些已用不到的參數設為 null ,或是將一些自己用 code 產生的 UI remove
才不會讓這個 Activity 被其他 class 抓住而無法釋放

∞ 結語 ∞

雖然看起來很基本,但其實很多 Developer 卻會忽略掉這些部分,所以要說是基本,但我認為還是算一些進階的技巧
而這些東西沒有控制好,在 Samsung 的手機上反應是最明顯的
只要記憶體沒管理好,你換幾個畫面, Memory 被抓住一堆而無法釋放時,就會以迅雷不及掩耳的速度 crash 給你看
讓你只能像我一樣直呼:該死的 Samsung !!!

==============寫完後的感想==============
我怎麼感覺最後開始文不對題起來了!?
我到底寫了什麼啊啊啊啊啊啊!!!?

Comments

comments powered by Disqus