目前看來,我們已經看到了,可以使用兩種方法去適應螢幕方向的改變。現在,讓我們看以下,當螢幕方向改變的時候,Activity狀態的改變。
1、建立一個工程:Orientations。
2、main.xml檔案。
[html]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 注意,這個EditText使用了android:id屬性 -->
<EditText
android:id="@+id/txtField1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<!-- 注意,這個EditText沒有使用android:id屬性 -->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
3、OrentationsActivity.java。
[java]
public class OrientationsActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("StateInfo", "onCreate");
}
@Override
public void onStart() {
Log.d("StateInfo", "onStart");
super.onStart();
}
@Override
public void onResume() {
Log.d("StateInfo", "onResume");
super.onResume();
}
@Override
public void onPause() {
Log.d("StateInfo", "onPause");
super.onPause();
}
@Override
public void onStop() {
Log.d("StateInfo", "onStop");
super.onStop();
}
@Override
public void onDestroy() {
Log.d("StateInfo", "onDestroy");
super.onDestroy();
}
@Override
public void onRestart() {
Log.d("StateInfo", "onRestart");
super.onRestart();
}
}
4、調試。
5、在兩個EditText中輸入一些字元。就像這樣。
6、按Ctrl+F11,改變螢幕的方向。展示了橫屏下的模擬器。注意,第一個EditText的內容仍然是存在的,但第二個EditText已經被清空了。(文章結尾會解釋這是為什麼)
7、觀察LogCat視窗。
[html]
12-15 12:27:20.747: D/StateInfo(557):onCreate
12-15 12:27:20.747: D/StateInfo(557):onStart
12-15 12:27:20.747: D/StateInfo(557):onResume
...
12-15 12:39:37.846: D/StateInfo(557):onPause
12-15 12:39:37.846: D/StateInfo(557):onStop
12-15 12:39:37.866: D/StateInfo(557):onDestroy
12-15 12:39:38.206: D/StateInfo(557):onCreate
12-15 12:39:38.216: D/StateInfo(557):onStart
12-15 12:39:38.257: D/StateInfo(557):onResume
從LogCat視窗可以看出,當螢幕方向改變的時候,Activity被銷毀了。
[html]
12-15 12:39:37.846: D/StateInfo(557):onPause
12-15 12:39:37.846: D/StateInfo(557):onStop
12-15 12:39:37.866: D/StateInfo(557):onDestroy
隨之,它又被重新建立了。
[html]
12-15 12:39:38.206: D/StateInfo(557):onCreate
12-15 12:39:38.216: D/StateInfo(557):onStart
12-15 12:39:38.257: D/StateInfo(557):onResume
理解Activity的這種行為變化是很重要的,因為在螢幕方向改變之前,我們要執行一些必要的操作去儲存當前activity的“狀態”。例如,你的activity有一些變數,這些變數儲存了一些需要被計算的值,這些值需要被儲存。對任何activity而言,你都應該在onPause()方法中去儲存“狀態”,因為onPause()方法是在螢幕方向改變時,出現的第一個方法。接下來的幾節教程,將會闡述儲存“狀態”的幾種不同方法。
!!!
另一個需要特別注意的地方:當儲存views的activity被銷毀的時候,只有那些在activity中被聲明的views(通過android:id屬性)會儲存它們自己的狀態。例如,當使用者在一個EditText中輸入資訊的時候,他可能改變螢幕的方向。這時,當activity被重新建立的時候,EditText中的資訊就會自動地儲存了,並重新顯示在EditText中。相反,如果不使用android:id聲明EditText,那麼activity就不會儲存EditText當前的任何內容。