Activity的生命周期主要分为7个阶段,每个阶段都有一个对应的回调方法:
1、onCreate()
当Activity第一次被创建时调用,在这个方法中要做Activity的初始化操作,比如 加载布局、绑定事件等。
onCreate()执行后当前Activity的状态为:不可见,不可交互。
2、onStart()
当Activiy要由不可见变为可见时调用。
onStart()执行后当前Activity的状态为:可见,不可交互。
3、onResume()
当Activiy准备好和用户交互时调用,调用后该Activity一定位于返回栈的栈顶。
onResume()执行后当前Activity的状态为:可见,可交互。
4、onPause()
这个方法在系统准备去启动或者恢复另一个Activity的时候调用。通常会在这个方法中将一些消耗 CPU的资源释放掉,也可以保存一些当前Activity的关键数据,以便以后需要恢复当前Activity时使用。需要注意的是,这个函数执行完以后,新的Activity才会创建,所以在这个方法中不建议执行太耗时的代码。
onPause()执行后当前Activity的状态为:可见,不可交互。
5、onStop()
这个方法在Activity完全不可见的时候调用。它和 onPause()方法的主要区别在于,如 果启动的新Activity是一个对话框式的Activity,那么 onPause()方法会得到执行,而 onStop() 方法并不会执行。 原因是对话框式的Activity一般是非全屏的,用户仍然可以看到对话框下面的Activity的部分界面,如果这时执行Activity的onStop() 方法的话,用户会发现对话框下面的Activity界面消失了,会影响用户体验。
onStop()执行后当前Activity的状态为:不可见,不可交互。
6、onDestroy()
这个方法在活动被销毁之前调用,调用之后之后活动的状态将变为销毁状态。
7、onRestart()
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
7种状态的转换关系可以参照下图:
另外还有一个金字塔型的流程图:
【举个栗子】
1、AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.activitydemo" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".Activity1" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Activity2" >
</activity>
<activity android:name=".Activity3" android:theme="@style/Theme.AppCompat.Dialog" >
</activity>
</application>
</manifest>
2、Activity1.java
package com.activitydemo;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class Activity1 extends AppCompatActivity implements View.OnClickListener, DialogInterface.OnClickListener {
private Button buttonOpenActivity2, buttonOpenActivity3, buttonOpenAlertDialog;
private AlertDialog.Builder builder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity1);
Log.i("INFO", "Activity1: onCreate");
buttonOpenActivity2 = (Button) findViewById(R.id.btn_act1_1);
buttonOpenActivity2.setOnClickListener(this);
buttonOpenActivity3 = (Button) findViewById(R.id.btn_act1_2);
buttonOpenActivity3.setOnClickListener(this);
buttonOpenAlertDialog = (Button) findViewById(R.id.btn_act1_3);
buttonOpenAlertDialog.setOnClickListener(this);
builder = new AlertDialog.Builder(this);
builder.setTitle("标题栏");
builder.setMessage("这是一个Alert对话框");
builder.setPositiveButton("确定", this);
}
@Override
protected void onStart() {
super.onStart();
Log.i("INFO", "Activity1: onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.i("INFO", "Activity1: onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i("INFO", "Activity1: onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i("INFO", "Activity1: onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("INFO", "Activity1: onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("INFO", "Activity1: onRestart");
}
@Override
public void onClick(View v) {
Intent intent;
switch(v.getId()) {
case R.id.btn_act1_1:
intent=new Intent(this, Activity2.class);
startActivity(intent);
break;
case R.id.btn_act1_2:
intent=new Intent(this, Activity3.class);
startActivity(intent);
break;
case R.id.btn_act1_3:
builder.show();
break;
default:
break;
}
}
@Override
public void onClick(DialogInterface dialog, int whichButton) {
}
}
3、Activity2.java
package com.activitydemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class Activity2 extends AppCompatActivity implements View.OnClickListener {
private Button buttonOpenActivity1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity2);
Log.i("INFO", "Activity2: onCreate");
buttonOpenActivity1 = (Button) findViewById(R.id.btn_act2_1);
buttonOpenActivity1.setOnClickListener(this);
}
@Override
protected void onStart() {
super.onStart();
Log.i("INFO", "Activity2: onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.i("INFO", "Activity2: onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i("INFO", "Activity2: onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i("INFO", "Activity2: onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("INFO", "Activity2: onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("INFO", "Activity2: onRestart");
}
@Override
public void onClick(View v) {
Intent intent=new Intent(this, Activity1.class);
startActivity(intent);
}
}
4、Activity3.java
package com.activitydemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
public class Activity3 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity3);
Log.i("INFO", "Activity3: onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.i("INFO", "Activity3: onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.i("INFO", "Activity3: onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i("INFO", "Activity3: onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i("INFO", "Activity3: onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("INFO", "Activity3: onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("INFO", "Activity3: onRestart");
}
}
5、layout_activity1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_act1_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="跳转到Activity2(全屏)"/>
<Button
android:id="@+id/btn_act1_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="跳转到Activity3(非全屏)"/>
<Button
android:id="@+id/btn_act1_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="打开对话框"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">
<TextView
android:text="Activity 1"
android:textSize="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
</LinearLayout>
</LinearLayout>
6、layout_activity2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_act2_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="返回Activity1"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">
<TextView
android:text="Activity 2"
android:textSize="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"/>
</LinearLayout>
</LinearLayout>
7、layout_activity2.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Activity 3" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" /> </LinearLayout>
【运行结果】
1、启动
Activity1: onCreate Activity1: onStart Activity1: onResume
2、跳转到ACTIVITY2
Activity1: onPause Activity2: onCreate Activity2: onStart Activity2: onResume Activity1: onStop
3、从ACTIVITY2返回ACTIVITY1
Activity2: onPause Activity1: onCreate Activity1: onStart Activity1: onResume Activity2: onStop
4、跳转到ACTIVITY3
Activity1: onCreate Activity1: onStart Activity1: onResume Activity1: onPause Activity3: onCreate Activity3: onStart Activity3: onResume
5、从ACTIVITY3返回ACTIVITY1Activity3: onPause Activity1: onResume Activity3: onStop Activity3: onDestroy
6、打开对话框(没有LOG输出)
7、从对话框返回ACTIVITY1(没有LOG输出)
除了界面切换时Activity会发生生命周期的转换之外,一些系统操作也会发生,比如:返回桌面时,锁屏时,横屏竖屏切换时等。
1、按桌面按钮返回桌面时:
Activity1: onPause Activity1: onStop
从桌面再次打开APP时:2、锁屏时:Activity1: onRestart Activity1: onStart Activity1: onResume
Activity1: onPause Activity1: onStop
解锁时:
Activity1: onRestart Activity1: onStart Activity1: onResume
3、横屏竖屏切换时(Ctrl + F12)Activity1: onPause Activity1: onStop Activity1: onDestroy Activity1: onCreate Activity1: onStart Activity1: onResume
除了上面列出的常见情况外,在不同的手机厂商开发的OS系统下,Activity表现出的生命周期可能也有差别,这时可以通过打印Log来确认。