深入解析Android 虚拟机
上QQ阅读APP看书,第一时间看更新

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()适合用于数据的持久化保存。