Android程序中Acticity的生命週期測試
(第一個跳轉到第二個Activity時,分爲滿屏、浮窗兩種形式)
一、當從FirstActivity(滿屏)跳轉到SecondActivity(非滿屏,浮窗形式)時:
執行結果是:(根據關鍵程度來劃分步驟)
1) FirstActivity的 onCreate()、onStart()、onResume方法執行;
2)當按下按鈕時,即由第一個界面FirstActivity切換到SecondActivity時,FirstActivity的onPause()方法執行,接着secondActivity的onCreate()、onStart()、onResume()方法執行;
3)當按下AVD(Android Virtual Device,即安卓虛擬機)上的“返回”鍵時,執行
了SecondActivity的onPause()方法;
4)再執行FirstActivity的onResume方法;
5)再執行SecodActivity的onStop()、onDestroy()方法;
6)當再次按下FirstAcivity中能夠跳轉到SecondActivity()的按鈕時;
7)FirstActivity的onPause方法被執行;
8)SecondActivity的onCreate()、onStart()、onResume()方法被執行--------說明一個新的SecondActivity被創建,與之前的不同,也驗證了步驟……6)中執行了SecondActivity()的onDestroy()方法。(對比步驟5),有FirstActivity的onResume()方法,說明不必再創建一個,而是之前的那個FirstActivity的繼續執行)
Activity生命週期流程圖
注:區分浮窗、非浮窗(滿屏)的兩種情況,看流程圖中的“The Activity is no longer visible”(此Activity是否可見)處於onPause()和onStop()方法之間。當爲浮窗形式時,SecondActivity的界面爲浮窗,但是FirstActivity的界面依然可見(相當於背景);不過,當爲非浮窗形式時,SecondActivity的界面爲全屏顯示,顯然會把FirstActivity的界面掩蓋,也就是FirstActivity的界面“no longer visible”
經過試驗,以上流程圖得到了驗證~~
二、當從FirstActivity(滿屏)跳轉到SecondActivity(滿屏,非浮窗形式)
1)FirstActivity的 onCreate()、onStart()、onResume方法執行
2)按下按鈕登錄到第二個界面,即SecondActivity時,FirstActivity的onPause()方法執行,
3)接着secondActivity的onCreate()、onStart()、onResume()方法執行
4)接着是FirstActivity的onStop方法執行
5)當按下AVD(Android Virtual Device,即安卓虛擬機)上的“返回”鍵時,執行
了SecondActivity的onPause()方法
6)再接着執行,FirstActivity的onRestart()、onStart()、onResume()方法
7)再執行SecondActivity的onStop()、onDestroy()方法
8)當第二次按下按鈕,從第一個Activity的界面到第二個Activity的界面時,FirstActivity的onPause()方法執行了
9)緊接着,SecondActivity的onCreate()、onStart()、onResume()方法執行了--------》說明一個新的SecondActivity被創建,與之前的不同,也驗證了步驟……6)中執行了SecondActivity()的onDestroy()方法。(對比步驟6),有FirstActivity的onResume()方法,說明不必再創建一個,而是之前的那個FirstActivity的繼續執行)
附錄源代碼:
第一種情況時(即所跳轉到的第二個界面,SecondActivity的顯示爲浮窗形式時)
注意此種情況的SecondActivity浮窗形成只要在AndroidManifest.xml裏的相應的Activity裏面加入android:theme="@android:style/Theme.Dialog",如果沒有這一句代碼,則SecondActivity會顯示爲全屏
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test_activitylife"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.test_activitylife.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="com.example.test_activitylife.SecondMainActivity"
android:label="@string/title_activity_second_main"
android:theme="@android:style/Theme.Dialog"
>
</activity>
</application>
</manifest>
1)FirstActivity的界面程序
package com.example.test_activitylife; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; //測試Activity的生命週期 public class MainActivity extends Activity { private Button bt; private static final String Tag="First_Activity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v(Tag," 的onCreate()方法執行"); setContentView(R.layout.activity_main); bt=(Button)this.findViewById(R.id.button1); bt.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intentLeap=new Intent(); intentLeap.setClass(MainActivity.this, SecondMainActivity.class); startActivity(intentLeap); } }); } @Override protected void onStart(){ super.onStart(); Log.v(Tag," 的Onstart()方法執行"); } @Override protected void onResume(){ super.onResume(); Log.v(Tag," 的onResume()方法執行"); } @Override protected void onPause(){ super.onPause(); Log.v(Tag," 的onPause()方法執行"); } @Override protected void onRestart(){ super.onRestart(); Log.v(Tag,"F 的onRestart()方法執行"); } @Override protected void onStop(){ super.onStop(); Log.v(Tag," 的 onStop()方法執行"); } @Override protected void onDestroy(){ super.onDestroy(); Log.v(Tag," 的 onDestroy()方法執行"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
界面顯示:
SecondActivity的界面程序
package com.example.test_activitylife; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; public class SecondMainActivity extends Activity { private final static String Tag="Second_Activity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v(Tag,"Second_Activity的onCreate()方法執行"); setContentView(R.layout.activity_second_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.second_main, menu); return true; } @Override protected void onStart(){ super.onStart(); Log.v(Tag," 的Onstart()方法執行"); } @Override protected void onResume(){ super.onResume(); Log.v(Tag,"的onResume()方法執行"); } @Override protected void onPause(){ super.onPause(); Log.v(Tag," 的onPause()方法執行"); } @Override protected void onRestart(){ super.onRestart(); Log.v(Tag," 的onRestart()方法執行"); } @Override protected void onStop(){ super.onStop(); Log.v(Tag," 的 onStop()方法執行"); } @Override protected void onDestroy(){ super.onDestroy(); Log.v(Tag," 的onDestroy()方法執行"); } }
界面顯示:
第二種情況時(即所跳轉到的第二個界面,SecondActivity的顯示爲非浮窗形式時)
FirstActivity的界面程序和第一種情況一樣,即可參考上面的,只是相應的AndroidManifest.xml文件裏少了 android:theme="@android:style/Theme.Dialog"
FirstActivity界面:
SecondActivity界面: