Activity 是整个 Android 平台的基本组成,生命周期主要包括三个阶段:
运行态( Running State ):
此时的 Activity 程序显示在屏幕前台,并且具有焦点,可以和用户的操作动作进行交互,例如,向用户提供信息、捕获用户单击按钮的事件并作处理;
暂停态( Paused State ):
此时 Activity 程序失去了焦点,并被其他处于运行态的 Activity 取代在屏幕前台显示,如果切换后的 Activity 程序不能铺满整个屏幕窗口或者是本身具备透明效果,则该暂停态的 Activity 程序对用户仍然可见,但是不可以与其进行交互;
停止态( Stopped State ):
停止态的 Activity 不仅没有焦点,而且是完全不可见,虽然其也保留状态和成员的信息,停止态的 Activity 会在系统需要的时候被结束;
Activity 程序的生命周期控制方法:
No. |
方法 |
可关闭? |
描述 |
1 |
onCreate |
不可以 |
当 Activity 程序启动之后会首先调用此方法 |
2 |
onRestart |
不可以 |
Activity 程序停止后再次显示给用户时,调用此方法 |
3 |
onStart |
不可以 |
当为用户第一次显示界面时调用此方法 |
4 |
onResume |
不可以 |
当获得用户焦点的时候调用此方法 |
5 |
onPause |
可以 |
当启动其他 Activity 程序时调用此方法,用户进行数据的提交、动画处理等操作 |
6 |
onStop |
可以 |
当一个 Activity 程序完全不可见时调用此方法,此时并不会销毁 Activity 程序 |
7 |
onDestory |
可以 |
程序被销毁时调用,调用 finish() 方法或系统资源不够使用时将调用此方法 |
下面我们来通过一个程序来观察一下 Activity 的生命周期
ActivityLifeCycle01Activity.java
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ActivityLifeCycle01Activity extends Activity { private Button mybut = null; /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { System.out.println("*** {A} FirstActivity --> onCreate()"); super.onCreate(savedInstanceState); super.setContentView(R.layout.first_main); this.mybut = (Button) super.findViewById(R.id.mybut); // 取得组件 this.mybut.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ActivityLifeCycle01Activity.this, SecondActivity.class); ActivityLifeCycle01Activity.this.startActivity(intent); // 执行跳转 } }); // 单击事件 } @Override protected void onDestroy() { System.out.println("*** {A} FirstActivity --> onDestroy()"); super.onDestroy(); } @Override protected void onPause() { System.out.println("*** {A} FirstActivity --> onPause()"); super.onPause(); } @Override protected void onRestart() { System.out.println("*** {A} FirstActivity --> onRestart()"); super.onRestart(); } @Override protected void onResume() { System.out.println("*** {A} FirstActivity --> onResume()"); super.onResume(); } @Override protected void onStart() { System.out.println("*** {A} FirstActivity --> onStart()"); super.onStart(); } @Override protected void onStop() { System.out.println("*** {A} FirstActivity --> onStop()"); super.onStop(); } }
SecondActivity.java
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class SecondActivity extends Activity { private Button mybut = null; @Override public void onCreate(Bundle savedInstanceState) { System.out.println("*** [B] SecondActivity --> onCreate()"); super.onCreate(savedInstanceState); super.setContentView(R.layout.second_main); this.mybut = (Button) super.findViewById(R.id.mybut); // 取得组件 this.mybut.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(SecondActivity.this, ActivityLifeCycle01Activity.class); SecondActivity.this.startActivity(intent); SecondActivity.this.finish(); } }); // 单击事件 } @Override protected void onDestroy() { System.out.println("*** [B] SecondActivity --> onDestroy()"); super.onDestroy(); } @Override protected void onPause() { System.out.println("*** [B] SecondActivity --> onPause()"); super.onPause(); } @Override protected void onRestart() { System.out.println("*** [B] SecondActivity --> onRestart()"); super.onRestart(); } @Override protected void onResume() { System.out.println("*** [B] SecondActivity --> onResume()"); super.onResume(); } @Override protected void onStart() { System.out.println("*** [B] SecondActivity --> onStart()"); super.onStart(); } @Override protected void onStop() { System.out.println("*** [B] SecondActivity --> onStop()"); super.onStop(); } }
程序一旦运行之后,后台输出:
*** {A} FirstActivity --> onCreate() *** {A} FirstActivity --> onStart() *** {A} FirstActivity --> onResume()
让第一个Activity跳转到第二个Activity(完全遮盖):
*** {A} FirstActivity --> onPause() *** [B] SecondActivity --> onCreate() *** [B] SecondActivity --> onStart() *** [B] SecondActivity --> onResume() *** {A} FirstActivity --> onStop()
1、通过按钮事件,返回第一个Activity:
*** [B] SecondActivity --> onPause() *** {A} FirstActivity --> onCreate() *** {A} FirstActivity --> onStart() *** {A} FirstActivity --> onResume() *** [B] SecondActivity --> onStop() *** [B] SecondActivity --> onDestroy()
2、通过后退按钮,返回第一个Activity:
*** [B] SecondActivity --> onPause() *** {A} FirstActivity --> onRestart() *** {A} FirstActivity --> onStart() *** {A} FirstActivity --> onResume() *** [B] SecondActivity --> onStop() *** [B] SecondActivity --> onDestroy()
上面的 1 和 2 步骤,其执行结果是一样的,所以我们可以总结出:
当使用返回按钮时,对于 2 会自动进行销毁,相当于调用了 finish() 方法执行。
因为现在第二个 Activity 程序属于完全遮盖了一个 Activity 程序,那么如果不完全遮盖,我们将第二个 Activity 改为对话框的形式:
<activity android:label="@string/app_name" android:name=".SecondActivity" android:theme="@android:style/Theme.Dialog" />
此时第二个 Activity 无法完全遮盖第一个 Activity
程序一旦运行之后,后台输出:
*** {A} FirstActivity --> onCreate() *** {A} FirstActivity --> onStart() *** {A} FirstActivity --> onResume()
让第一个Activity跳转到第二个Activity(不会完全遮盖):
*** {A} FirstActivity --> onPause() *** [B] SecondActivity --> onCreate() *** [B] SecondActivity --> onStart() *** [B] SecondActivity --> onResume()
1、通过按钮事件,返回第一个Activity:
*** [B] SecondActivity --> onPause() *** {A} FirstActivity --> onStop() *** {A} FirstActivity --> onCreate() *** {A} FirstActivity --> onStart() *** {A} FirstActivity --> onResume() *** [B] SecondActivity --> onStop() *** [B] SecondActivity --> onDestroy()
2、现在第一个Activity程序并不会停止执行,通过后退按钮,返回第一个Activity:
*** [B] SecondActivity --> onPause() *** {A} FirstActivity --> onResume() *** [B] SecondActivity --> onStop() *** [B] SecondActivity --> onDestroy()
多个 Activity 程序的入栈操作,最早先打开的 Activity ,则放在栈底,出栈,则以“后进先出”原则;
一旦使用 finish() 方法,就表示一个 Activity 程序结束了,就不会入栈了。