2011年12月28日 星期三

Android - Lifecycle (1) - activity

請看官網的說明
http://developer.android.com/reference/android/app/Activity.html

簡單的程式測式碼如下:
public class TestRotate extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        Log.d("TestRotate","create");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
   
    public void onStart(){
        Log.d("TestRotate","onStart");
        super.onStart();
    }

    public void onResume(){
        Log.d("TestRotate","onResume");
        super.onResume();
    }

    public void onRestart(){
        Log.d("TestRotate","onRestart");
        super.onRestart();
    }
   
   
    public void onPause(){
        Log.d("TestRotate","onPause");
        super.onPause();
    }

    public void onStop(){
        Log.d("TestRotate","onStop");
        super.onStop();
    }

    public void onDestroy(){
        Log.d("TestRotate","onDestroy");
        super.onDestroy();
    }

}


來看看一個Activity在硬體按鈕操作下的流程

程式第一次執行:
onCreate
onStart
onResume

按下home key:
onPause
onStop

再次程式執行:
onRestart
onStart
onResume

按下return Key:
onPause
onStop
onDestroy

接下來看看啟動Auto-rotate screen時,旋轉了畫面的流程:
onPause
onStop
onDestroy
onCreate
onStart
onResume

請注意,正常情況下如果旋轉畫面,其實是Destroy這個Activity後,再重啟一個Activity。換言之,有可能會讓原本的資料流失,如果要避免這個現象,可以在AndroidManifest.xml中,修改activity的tag如下:

        <activity android:name=".Test"
                  android:label="@string/app_name"
                  android:configChanges="orientation|keyboardHidden"
                  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

加上 android:configChanges="orientation",則程式不會重新經歷onPause到onResume的動作。而後面的keyboardHidden則是當使用者開啟手機的實體鍵盤時,不會重新經歷onPause到onResume的動作。

沒有留言:

張貼留言