活动(Activity)的生命周期
1、活动的状态
- 1、运行状态:当一个活动位于返回栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是运行状态的活动。
- 2、暂停状态:当一个活动不再处于栈顶位置,但仍然可见时,这是活动就进入了暂停状态。
- 3、停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
- 4、销毁状态:当一个活动从返回栈中移除后就变成了销毁状态。
2、活动的生存期
生命周期流程图(来自官方文档):
onCreate()。活动第一次被创建的时候被调用,在该方法中完成活动的初始化操作,比如加载布局、绑定事件等。
- onStart()。活动由不可见变为可见的时候调用。
- onResum()。活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。
- onPause()。系统准备启动或恢复另一个活动的时候被调用。我们常会在这个方法中将一些消耗CPU的资源释放叼,以及保存一些关键数据,但这个方法执行速度一定要快,不然会影响到新的栈顶活动的使用。
- onStop()。在活动完全不可见的时候调用。
- onDestroy()。在活动被销毁之前调用,之后活动的状态变成销毁状态。
- onRestart()。活动由停止状态变为运行状态之前调用,也就时活动被重新启动了。
3、体验活动的生命周期
讲了那么多理论知识,也是时候实战一下了,下面我们将通过一个实例,更加直观的体验活动的生命周期。
现在编辑normal_layout.xml,布局非常简单,只有一个TextView用于显示一行文字:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.linbots.activitytestdemo.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="This is NormalActivity"
android:textColor="#333333"
android:textSize="24sp" />
</LinearLayout>
然后,我们再来链接dialog_layout.xml,只需要将上面的代码copy,更换显示文字即可:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.linbots.activitytestdemo.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="This is DialogActivity"
android:textColor="#333333"
android:textSize="24sp" />
</LinearLayout>
两个布局文件的代码几乎没有区别,只是显示的文字不同而已。
NormalActivity 和 DialogActivity中的代码我们保持默认就好了,不需要做任何改动。
其实,我们单从这两个活动的名字上就可以看出,这两个活动一个普通的活动,一个是对话框式活动。把普通活动设置成对话框式活动,我们只需要修改AndroidManifest.xml的配置:
<activity
android:name=".DialogActivity"
android:theme="@style/Theme.AppCompat.Dialog" />
main_layout.xml布局里有两个Button,这里就不贴代码了。MainActivity中的代码如下:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate");
setContentView(R.layout.main_layout);
findViewById(R.id.start_normal_aty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, NormalActivity.class));
}
});
findViewById(R.id.start_dialog_aty).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, DialogActivity.class));
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart");
}
}
可以看到,MainActivity中分别为两个按钮注册了点击事件,然后在Activity的7个回调方法中分别打印了一句话,这样我们就可以通过观察日志的方式来更直观的理解活动的生命周期。
现在运行程序,效果图如下:
这时观察logcat中的打印日志:
可以看到,当MainActivity第一次被创建时会依次执行 onCreate()、onStart()、onResume()方法。然后我们点击第一个Button,启动NormalActivity:
此时的打印信息如下:
由于MainActivity已经被NormalActivity完全挡住,因此onPause()和onStop()方法都会执行。然后按下Back键返回MainActivity,打印信息如下:
由于之前MainActivity已经进入了停止状态,所有onRestart()方法会得到执行,之后又会依次执行onStart()、onResume()方法(注意此时onCreate()方法并不执行)。
然后点击第二个Button,启动DialogActivity,如图:
此时logcat信息如下:
可以看到,只有 onPause()方法等到执行,onStop()方法并没有执行,这是因为此时DialogActivity并没有完全的把MainActivity遮挡住,MainActivity只是进入了暂停状态,并没有进入停止状态。按下Back返回MainActivity也只有onResume()方法会得到执行:
最后,在MainActivity按Back键退出程序,打印的logcat如下:
依次会执行onPause()、onStop() 和 onDestroy() 方法,最终销毁MainActivity