屏幕方向变化时Activity销毁

来源:互联网 发布:surface rt软件 编辑:程序博客网 时间:2024/04/27 14:38

目前看来,我们已经看到了,可以使用两种方法去适应屏幕方向的改变。现在,让我们看以下,当屏幕方向改变的时候,Activity状态的改变。

1、创建一个工程:Orientations。


2、main.xml文件。

Html代码 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6. <!-- 注意,这个EditText使用了android:id属性 -->  
  7. <EditText  
  8.     android:id="@+id/txtField1"  
  9.     android:layout_width="fill_parent"  
  10.     android:layout_height="wrap_content" />  
  11. <!-- 注意,这个EditText没有使用android:id属性 -->  
  12. <EditText  
  13.     android:layout_width="fill_parent"  
  14.     android:layout_height="wrap_content" />  
  15.   
  16. </LinearLayout>  
3、OrentationsActivity.java。
Java代码 
  1. public class OrientationsActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.         Log.d("StateInfo""onCreate");  
  8.    }  
  9.       
  10.     @Override  
  11.     public void onStart() {  
  12.         Log.d("StateInfo""onStart");  
  13.         super.onStart();  
  14.     }  
  15.   
  16.     @Override  
  17.     public void onResume() {  
  18.         Log.d("StateInfo""onResume");  
  19.         super.onResume();  
  20.     }  
  21.   
  22.     @Override  
  23.     public void onPause() {  
  24.         Log.d("StateInfo""onPause");  
  25.         super.onPause();  
  26.     }  
  27.   
  28.     @Override  
  29.     public void onStop() {  
  30.         Log.d("StateInfo""onStop");  
  31.         super.onStop();  
  32.     }  
  33.   
  34.     @Override  
  35.     public void onDestroy() {  
  36.         Log.d("StateInfo""onDestroy");  
  37.         super.onDestroy();  
  38.     }  
  39.   
  40.     @Override  
  41.     public void onRestart() {  
  42.         Log.d("StateInfo""onRestart");  
  43.         super.onRestart();  
  44.     }  
  45.   
  46. }  
4、调试。

5、在两个EditText中输入一些字符。就像这样。

6、按Ctrl+F11,改变屏幕的方向。下图展示了横屏下的模拟器。注意,第一个EditText的内容仍然是存在的,但第二个EditText已经被清空了。(文章结尾会解释这是为什么)

7、观察LogCat窗口。

Html代码 
  1. 12-15 12:27:20.747: D/StateInfo(557):onCreate  
  2. 12-15 12:27:20.747: D/StateInfo(557):onStart  
  3. 12-15 12:27:20.747: D/StateInfo(557):onResume  
  4. ...  
  5. 12-15 12:39:37.846: D/StateInfo(557):onPause  
  6. 12-15 12:39:37.846: D/StateInfo(557):onStop  
  7. 12-15 12:39:37.866: D/StateInfo(557):onDestroy  
  8. 12-15 12:39:38.206: D/StateInfo(557):onCreate  
  9. 12-15 12:39:38.216: D/StateInfo(557):onStart  
  10. 12-15 12:39:38.257: D/StateInfo(557):onResume  
从LogCat窗口可以看出,当屏幕方向改变的时候,Activity被销毁了。
Html代码 
  1. 12-15 12:39:37.846: D/StateInfo(557):onPause  
  2. 12-15 12:39:37.846: D/StateInfo(557):onStop  
  3. 12-15 12:39:37.866: D/StateInfo(557):onDestroy  
随之,它又被重新创建了。
Html代码 
  1. 12-15 12:39:38.206: D/StateInfo(557):onCreate  
  2. 12-15 12:39:38.216: D/StateInfo(557):onStart  
  3. 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当前的任何内容。

0 0