[Android] Activity生命週期


Actvity 堆棧java

每一個Actvity的狀態由它所在Activity棧中的位置所決定,全部當前正在運行的Actvity將遵循照後進先出的原則。當一個新的 Activity啓動,當前的Activity將移至堆棧的頂部,若是用戶使用Back按鈕,或在前臺Activity被關閉,下一個Activity將 被激活而且移至到堆棧的頂部。這個過程以下圖所示數據庫

Activity狀態安全

隨着Activity的建立和銷燬,也就會進出棧如上圖所示,其中可能會經歷如下四種狀態:網絡

  • Active狀態:這時候Activity處於棧頂,且是可見的,有焦點的,可以接收用戶輸入前 景Activity。Runtime將試圖不惜一切代價保持它活着,甚至殺死其餘Activity以確保它有它所需的資源。當另外一個Activity變成Active時,當前 的將變成Paused狀態。動畫

  • Paused狀態:在某些狀況下,你的Activity是可見的,但沒有焦 點,在這時候,Actvity處於Paused狀態。例如,若是有一個透明或非全屏幕上的Activity在你的Actvity上面,你的 Activity將。當處於Paused狀態時,該Actvity仍被認爲是Active的,可是它不接受用戶輸入事件。在極端狀況下,Runtime將殺死Paused Activity,以進一步回收資源。當一個Actvity徹底被遮住時,它將進入Stopped狀態。spa

  • Stopped 狀態:當Activity是不可見的時,Activity處於Stopped狀態。Activity將繼續保留在內存中保持當前的全部狀態和成員信息,假 設系統別的地方須要內存的話,這時它是被回收對象的主要候選。當Activity處於Stopped狀態時,必定要保存當前數據和當前的UI狀態,不然一 旦Activity退出或關閉時,當前的數據和UI狀態就丟失了。線程

  • Inactive狀態:Activity被殺掉之後或者被啓動之前,處於Inactive狀態。這時Activity已被移除從Activity堆棧中,須要從新啓動才能夠顯示和使用。code

  • 爲了確保Activity可以及時的響應狀態的變化,提供了一系列的事件處理程序來處理Activity的狀態轉移,參考下圖和示例代碼。
    對象

  • public class MyActivityextends Activity
    {
    // 在Activity生命週期開始時被調用 
    public void onCreate(Bundle
    icicle) {
    }
    //當activity從中止狀態從新啓動時調用 
    public void onRestart(){
    }
    //當activity對用戶即將可見的時候調用。 
    public void onStart(){
    }
  • // onStart完成後被調用,用來回復UI狀態 
    public void onRestoreInstanceState(Bundle savedInstanceState)
    {
    }
    //當activity將要與用戶交互時調用此方法,此時activity在activity棧的棧頂,用戶輸入已經
    能夠傳遞給它 
    public void onResume(){
    }
    // Activity即將移出棧頂保留UI狀態時調用此方法 
    public void onSaveInstanceState(Bundle savedInstanceState)
    {
    }
    //當系統要啓動一個其餘的activity時調用(其餘的activity顯示以前),這個方法被用來提交那些持久數據的改變、中止動畫、和其餘佔用
    CPU資源的東西。因爲下一個activity在這個方法返回以前不會resumed,因此實現這個方法時代碼執行要儘量快。
    public void onPause(){
    }
    //當另一個activity恢復並遮蓋住此activity,致使其對用戶再也不可見時調用。一個新activity啓動、其它activity被切換至前景、當前activity被銷燬時都會發生這種場景。
    public void onStop(){
    }
    //在activity被銷燬前所調用的最後一個方法,當進程終止時會出現這種狀況
    public void onDestroy(){
    }
  • 在一個Activity的完整的生命週期裏,既創造和銷燬之間,它會通過一個或多個不一樣狀態之間的轉移包括從可見的到不可見,從Active到Inactive。每一次狀態的轉移都將觸發以上這些事件。生命週期


  • Activity完整的生命週期
    完整的Activity生命週期之間從調用的OnCreate開始,到調用onDestroy結束。有可能在某些狀況下,一個Activity被終止時並不調用onDestroy方法。
    使用OnCreate方法來初始化你的Activity:初始化的用戶界面,分配引用類變量,綁定數據控件,並建立服務和線程。在OnCreate方法傳 遞的對象Bundle包含最後一次調用onSaveInstanceState保存的UI狀態。你可使用這個Bundle恢復用戶界面到之前的狀態,無 論是在OnCreate方法或經過覆蓋onRestoreInstanceStateMethod方法。
    覆蓋onDestroy方法來清理OnCreate中建立的任何資源,並確保全部外部鏈接被關閉,例如網絡或數據庫的聯繫。
    爲了不創造短時間對象和增長垃圾收集的時間,以至對用戶體驗產生直接影響。若是你的Activity須要建立一些對象的話,最好在onCreate方法中建立,由於它僅調用一次在一個Actvity的完整生命週期中。


  • 例如:某個Activity有一個在後臺運行的線程,用於從網絡下載數據,則該Activity能夠在onCreate()中建立線程,在onDestory()中中止線程


  • Activity可見的生命週期
    一個Activity可見的生命週期始於OnStart調用,結束於OnStop調用。在這兩個方法中間,你的Actvity將會對用戶是可見的,儘管它 可能沒有焦點,也可能部分被遮擋着。在一個Activity完整的生命週期中可能會通過幾個Activity可見的生命週期,由於你的Activity可 能會常常在前臺和後臺之間切換。在極端狀況下,Runtime將殺掉一個Activity即便它在可見狀態而且並不調用onStop方法。

  • OnStop方法用於暫停或中止動畫,線程,定時器,服務或其餘專門用於更新用戶界面程序。當用戶界面是再次可見時,使用OnStart(或onRestart)方法來恢復或從新啓動這些程序,。

  • onRestart方法優先於onStart被調用當一個Activity被重現可見時,使用它你能夠實現一些Activity從新可見時的特殊的處理。

  • 例如:能夠在onStart中註冊一個Intent Receiver來監聽數據變化致使UI的變更,當再也不須要顯示時候,能夠在onStop()中註銷它。onStart(),onStop()均可以被屢次調用,由於Activity隨時能夠在可見和隱藏之間轉換。

  • OnStart / OnStop方法也被用來註冊和註銷專門用於更新用戶界面Intent接收者。


  • Activity活躍的生命週期
    一個Activity活躍 的生命週期始於OnResume調用,結束於OnPause調用。一個活躍的Actvity老是在前臺而且接收用戶輸入事件。當一個新的Actvity啓 動,或該設備進入休眠狀態,或失去焦點,Activity活躍的生命週期就結束了。儘可能在onPause和onResume方法中執行較量輕的代碼以確保 您的應用程序可以快速響應Acitvity在前臺和後臺之間切換。


  • 在調用onPause以前,onSaveInstanceState會被調用。這個方法提供了一個機會保存當前的UI狀態到Bundle當中。 Bundle信息將會被傳遞到OnCreate和onRestoreInstanceState方法。使用onSaveInstanceState保存 UI狀態(如檢查按鈕狀態,用戶焦點,未提交用戶輸入)可以確保目前相同的用戶界面當Activity下次被激活時。在Activity活躍生命週期中, 你能夠安全地認onSaveInstanceState和onPause將被調到即便當前進程將終止。

相關文章
相關標籤/搜索