Android 程式開發:(七)處理變化 —— 7.1 觸發事件

目前看來,我們已經看到瞭,可以使用兩種方法去適應屏幕方向的改變。現在,讓我們看以下,當屏幕方向改變的時候,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當前的任何內容。

發佈留言