6.4 测试生命周期
经过本书前面内容的学习,相信读者已经了解了Android生命周期的基本知识。在本节中,将通过几段应用代码来测试Android的生命周期。
(1)首先看MainActivity的代码,这是软件启动时默认打开的Activity。
package cn.itcast.life; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG, "onCreate()"); Button button = (Button) this.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, OtherActivity.class); startActivity(intent); } }); Button threebutton = (Button) this.findViewById(R.id.threebutton); threebutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ThreeActivity.class); startActivity(intent); } }); } @Override protected void onDestroy() { Log.i(TAG, "onDestroy()"); super.onDestroy(); } @Override protected void onPause() { Log.i(TAG, "onPause()"); super.onPause(); } @Override protected void onRestart() { Log.i(TAG, "onRestart()"); super.onRestart(); } @Override protected void onResume() { Log.i(TAG, "onResume()"); super.onResume(); } @Override protected void onStart() { Log.i(TAG, "onStart()"); super.onStart(); } @Override protected void onStop() { Log.i(TAG, "onStop()"); super.onStop(); } }
(2)以下是MainActivity匹配的XML布局代码:
<? xml version="1.0" encoding="utf-8"? > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打开OtherActivity" android:id="@+id/button" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打开ThreeActivity" android:id="@+id/threebutton" /> </LinearLayout>
(3)以下是一个新的Activity,为了验证“onstop”方法,使用下面的OtherActivity将前面的MainActivity覆盖掉:
package cn.itcast.life; import android.app.Activity; import android.os.Bundle; public class OtherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { //TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.other); } }
以下是OtherActivity匹配的XML布局代码:
<? xml version="1.0" encoding="utf-8"? > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="这是OtherActivity" /> </LinearLayout>
(4)以下的ThreeActivity用于测试onpause方法,使用半透明或者提示框的形式,覆盖掉前面的MainActivity:
package cn.itcast.life; import android.app.Activity; import android.os.Bundle; public class ThreeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { //TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.three); } }
以下是ThreeActivity匹配的XML布局代码:
<? xml version="1.0" encoding="utf-8"? > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第三个Activity" /> </LinearLayout>
(5)以下是项目清单文件,在此使用了android:theme="@android:style/Theme.Dialog"来设置Activity的样式风格的弹出框:
<? xml version="1.0" encoding="utf-8"? > <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.itcast.life" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".OtherActivity" android:theme="@android:style/Theme.Dialog"/> <activity android:name=".ThreeActivity"/> </application> <uses-sdk android:minSdkVersion="8" /> </manifest>
运行上述程序,如果在Debug状态时切换到DDMS界面,可以马上看到所打印出来的Log信息,这样就可以很清楚地分析程序的运行过程。
Activity的onSaveInstanceState()和onRestoreInstanceState()并不是生命周期方法,它们不同于onCreate()和onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况时,例如内存不足、用户直接按Home键等操作,当系统销毁一个Activity时,onSaveInstanceState()才会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。