廣告

2014年11月28日 星期五

[Android LifeCycle][Android 生命週期]

發現每次都會忘記android的lifecycle,只得每次在印log出來看=.=
所以乾脆紀錄一下。

onCreate(),onStart(),onResume()

第一次開啟app時,依序執行onCreate(),onStart(),onResume(),之後的activity轉跳如果不是呼叫finis或startActivity(new Intent(A.this, B.class))onCreate()只會跑一次,所以會將元件以及變數的初始化寫在onCreate()裡面。




onStop(),onResume()

當目前activity不是在螢幕最上端的時候(也就是你看不到你目前正在看的頁面時),舉凡有其他app突然執行(來電,鬧鐘等等),或是你切換activity時沒呼叫finih,這些過程都會先跑onStop,所以可以在onStop裡面做一些釋放記憶體,硬體(相機),寫"少量"重要資料到DB等行為,但別做太多事情不然會導致換頁過慢。

當回到原本activity時會呼叫onResume(),所以可以在這邊寫在onStop()被你釋放掉的東西。





onStop(),onRestart()

當按下home鍵,或是切換app,都會跑到onStop(),並且建議在這邊做寫入DB等動作,因為有很大的機率不會馬上再啟動這個APP,雖然從onStop回來也會call onStart(),但是onRestart()只會是從onStop()回來,onStart()也會是onCreate,所以在onRestart()做復原的動作。 



onSaveInstanceState(), onRestoreInstanceState()

onStop時會呼叫onSaveInstanceState(),並寫可以在這裡把activity狀態用key-vaule的方式儲存下來。
onCreate()會呼叫onRestoreInstanceState(),此時就可以取得之前儲存的bundle。

整體的lifeCycle

State diagram for an Android Activity Lifecycle.

一般啟動

onCreate -> onStart -> onResume

呼叫另一個 Activity

onPause(1) -> onCreate(2) -> onStart(2) - onResume(2) -> onStop(1)

回原 Activity

onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestroy(2)

退出結束

onPause -> onStop -> onDestroy

回收後再啟動

onCreate -> onStart -> onResume

按home鍵

onPause -> onStop

測試用:

public class Lewis extends Activity {
        private static final String TAG = "Bmi";

    public void onCreate()
    {
        super.onCreate(...);
        Log.v(TAG,"onCreate");
    }
    
    public void onStart()
    {
        super.onStart();
        Log.v(TAG,"onStart");
    }
    
    public void onResume()
    {
        super.onResume();
        Log.v(TAG,"onResume");
    }
    
    public void onPause()
    {
        super.onPause();
        Log.v(TAG,"onPause");
    }
    
    public void onStop()
    {
        super.onStop();
        Log.v(TAG,"onStop");
    }    
    
    public void onRestart()
    {
        super.onRestart();
        Log.v(TAG,"onReStart");
    }

    public void onDestroy()
    {
        super.onDestroy();
        Log.v(TAG,"onDestroy");
    }
    }


沒有留言:

張貼留言