[Android] Lifecycle筆記

可以參考官方的文章

前言 - Activity啟動

Android的Activity的生命週期是一種金字塔形式的結構,當Activity被創建時,會逐漸地往頂部onResume()前進,到達後又因為別的理由,像是接聽來電,才會讓該Activity的狀態往下走。

在創建第一個Activity後,會先呼叫onCreate(),然後進入onStart(),此時使用者就能看到Activity了,但隨即立刻就會進入onResume(),並不會停留在start太久。

當結束時,通常會在onPause()和onStop()處理大部分的資料,以及作結束,但如果在onCreate()有作背景的tread或是可能造成記憶體洩漏的long-running resources的話,就需要於onDestroy()裡面去作結束了,換句話說,onDestroy()是相對於onCreate()而存在的。

暫停(Pause)與恢復(Resume)

暫停(Pause)

  • 暫停Pasue:使用中的Activity被其他可見的元件(component)部分阻擋住,只要Activity只有一部分能看到,而且目前不是正被注意的Activity,就是暫停。
  • 停止Stop:若是全部都被阻擋,就是停止。
若Activity要進入暫停狀態,系統就會在你的Activity上呼叫onPause(),收到onPause()表示你的Activity將要暫停一下,而且這通常是表示使用者將離開目前的Activity的最早的信號。

在onPause()回呼中,需執行下列幾種事項:
  • 停止動畫或其他使用CPU的行為。
  • 除非使用者預期這樣的改變會被永久性的儲存,否則允許未儲存的改變(像是信件的草稿)。
  • 釋放系統資源,於Activity暫停時會影響電池電量而且使用者已不需要他們的。
在onPause()中不應執行需要耗費大量CPU資源的工作,比方說,讀寫資料到資料庫內。因為這會影響到切換到下一個Activity的速度,而且如果你確定目前的Activity是要被停止的話,更要減低onPause()內的操作量。你可以在onStop()內執行負擔沈重的關閉操作。

回到你的Activity

當你再次回到你的Activity時,系統會呼叫onResume()。

執行時機

Activity回到前端或是第一次被創建時。

實作內容

  • 初始化在onPause()釋放掉的部分。
  • 每一次Activity進入onResume()時都要進行的初始化(像是動畫)。

Activity的停止與再啟動


Activity的停止

收到onStop()時:
  1. Activity就看不到。
  2. 釋放掉當使用者不使用時就不需要的資源。
  3. 若需要系統資源的話,系統會銷毀實例。
  4. 極端狀況下,系統會在不呼叫onDestroy()的情況下砍掉app的程序。所以最好要在onStop()裡面處理好資源的釋放以避免記憶體洩漏。
  5. 如前述,onStop()較onPause()更適合處理耗費大量CPU的操作,像是讀寫資料庫。

Activity的開始/再啟動

執行時機

只有當Activity從Stop狀態回到前端時,Activity會收到呼叫onRestart()。系統也會呼叫onStart()方法,當Activity變成可見時就會呼叫,所以在Activity初次被創建時以及從Stop狀態回復時都會被呼叫。

實作內容

注意onRestart()是只有當Activity從stop狀態中回復才會呼叫,而且當Activity的實力沒有被刪除時,才能在此方法內執行一些必要的restore動作。但app很少需要用onRestart()去restore一些activity的狀態的,因此並沒有什麼關於此方法的指導方針。

onStop()會清除activity的資源,所以這些東西需要在activity再次啟動時重新實例化(re-instantiate),因為執行時機的關係,應使用onStart()回呼以對應onStop()方法。

Activity的清除

通常大部分該釋放的資源都在onStop()都處理完了,系統要刪除activity時會呼叫onDestroy(),此方法已經沒有什麼事情需要做,僅須注意此方法是最後能清除會造成記憶體洩漏的步驟。

Activity的再創建


再創建的過程我們會需要跟該acvity之前狀態有關的data,本節將說明跟再創件相關的data的流程。

前言

當Activity被結束或是被刪除時,該Activity的實例就消失了。但系統記得這個Activity存在過,系統會使用一組儲存於Activity被刪除時的狀態的data來創建Activity實例。系統用於恢復之前狀態所儲存的data叫做實例狀態(instance state),是一組儲存於Bundle物件內的鍵值對(key- value pairs)

注意:每一次當螢幕旋轉時,Activity都會被刪除以及再創建。這是因為螢幕的設定因為螢幕旋轉而改變,需要讀取不同的資源的關係。

預設下,系統會使用Bundle實例狀態儲存Activity layout內每一個view物件的資訊(像是輸入到EditText內的text值)。所以,當你的Activity實例被刪除以及創建時,layout的狀態就會被恢復成之前的狀態,這些都不需要任何的程式碼。

如果你的Activity狀態可能需要儲存更多的data,這時你必須覆寫onSaveInstanceState()回呼,系統會在使用者離開Activity並且傳遞Activity被無預期的結束時儲存的Bundle物件給它時呼叫這個方法。若系統必須再創建Activity實例,他會把同樣的Bundle物件傳遞給 onRestoreInstanceState()onCreate()方法。

儲存/恢復你的實例狀態

  • onSaveInstanceState():將之覆寫,並把額外的資料以鍵值對的方式存入Bundle中。覆寫實記得一定要呼叫super的onSaveInstanceState(),否則不會執行預設的資料儲存。
  • onCreate():要先檢查Bundle是不是null,若是,則要創建新的實例。
  • onRestoreInstanceState():當有已儲存的資料可供恢復時系統才會呼叫,所以不用檢查Bundle是否null。此方法於onStart()被呼叫,所以也可以此來恢復實例狀態。

留言