可以參考官方的文章。
前言 - Activity啟動
在創建第一個Activity後,會先呼叫onCreate(),然後進入onStart(),此時使用者就能看到Activity了,但隨即立刻就會進入onResume(),並不會停留在start太久。
當結束時,通常會在onPause()和onStop()處理大部分的資料,以及作結束,但如果在onCreate()有作背景的tread或是可能造成記憶體洩漏的long-running resources的話,就需要於onDestroy()裡面去作結束了,換句話說,onDestroy()是相對於onCreate()而存在的。
在onPause()回呼中,需執行下列幾種事項:
暫停(Pause)與恢復(Resume)
暫停(Pause)
- 暫停Pasue:使用中的Activity被其他可見的元件(component)部分阻擋住,只要Activity只有一部分能看到,而且目前不是正被注意的Activity,就是暫停。
- 停止Stop:若是全部都被阻擋,就是停止。
在onPause()回呼中,需執行下列幾種事項:
- 停止動畫或其他使用CPU的行為。
- 除非使用者預期這樣的改變會被永久性的儲存,否則允許未儲存的改變(像是信件的草稿)。
- 釋放系統資源,於Activity暫停時會影響電池電量而且使用者已不需要他們的。
回到你的Activity
當你再次回到你的Activity時,系統會呼叫onResume()。執行時機
Activity回到前端或是第一次被創建時。實作內容
- 初始化在onPause()釋放掉的部分。
- 每一次Activity進入onResume()時都要進行的初始化(像是動畫)。
Activity的停止與再啟動
Activity的停止
收到onStop()時:
- Activity就看不到。
- 釋放掉當使用者不使用時就不需要的資源。
- 若需要系統資源的話,系統會銷毀實例。
- 極端狀況下,系統會在不呼叫onDestroy()的情況下砍掉app的程序。所以最好要在onStop()裡面處理好資源的釋放以避免記憶體洩漏。
- 如前述,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都會被刪除以及再創建。這是因為螢幕的設定因為螢幕旋轉而改變,需要讀取不同的資源的關係。
但如果你的Activity狀態可能需要儲存更多的data,這時你必須覆寫onSaveInstanceState()回呼,系統會在使用者離開Activity並且傳遞Activity被無預期的結束時儲存的Bundle物件給它時呼叫這個方法。若系統必須再創建Activity實例,他會把同樣的Bundle物件傳遞給 onRestoreInstanceState()和onCreate()方法。
儲存/恢復你的實例狀態
- onSaveInstanceState():將之覆寫,並把額外的資料以鍵值對的方式存入Bundle中。覆寫實記得一定要呼叫super的onSaveInstanceState(),否則不會執行預設的資料儲存。
- onCreate():要先檢查Bundle是不是null,若是,則要創建新的實例。
- onRestoreInstanceState():當有已儲存的資料可供恢復時系統才會呼叫,所以不用檢查Bundle是否null。此方法於onStart()被呼叫,所以也可以此來恢復實例狀態。
留言
張貼留言