上一篇博客概述了基本的Activity的启动流程以及需要注意事项,如果有不知道activity是什么的可以先去看看,链接android五大组件之activity初探。
今天我要讨论的是activity生命周期相关问题, 生命周期其实很好理解,就是从存在到消亡的过程。这也非常符合自然规律,好比春天百花齐放,秋天落叶归根,人从出生到走向死亡也都是这样一个过程。
activity主要分为四个状态
- 运行
- 暂停
- 停止
- 销毁
先说运行,也就是activity处于栈顶,用户可交互状态即为运行状态。暂停状态是当activity被透明的activity或者dialog遮挡,此时的状态为暂停。停止状态是当用户按下home键应用退出前台时的状态。销毁状态是从栈顶位置移除或不处于栈顶时,比如用户按下返回键,或调用finish()方法,此时的状态是销毁状态。
相信很多人都看过下面这张图,这是google android developer官方文档对activity lifecycle的介绍文档中的一张图。
总体上来浏览下这个过程,总共有四个场景:
- 启动一个activity:onCreate->onStart->onResume
- 当按下home键退出当前activity: onPause->onStop
- 重新回到activity: onRestart->onStart->onResume
- 按下返回键或调用finish()方法:onPause->onStop->onDestory
当一个新的Activity被启动后,首先调用的是onCreate方法,这个方法可用来初始化布局和做一些初始化数据工作或者恢复数据,也是最常用的方法。接着是onStart,这个方法表示当前的界面处于可见状态,但是用户还不能交互。往下是onResume,这个方法被调用说明activity已经启动成功,用户可以交互。那么接下来如果用户启动了一个透明的activity或一个dialog activity,那么就会调用onPause方法。这个方法被调用说明当前的activity处于暂停状态,但用户还是可以看见。当用户此时按下home按键,那么我们的整个activity都看不见了,此时就会调用onStop,表示当前activity处于停止状态。用户重新打开这个activity会先调用onRestart,表示用户重新启动了activity,紧接着调用onStart-onResume。如果用户按下返回键,或者调用finish()方法,就会调用onDestory方法,此activity将不再处于任务栈顶位置(任务栈后续章节介绍)。既然有了大致流程,我们还是看看代码。下面这个代码前面android五大组件之activity初探讲过,其实就是启动新的一个activity, 这里的名字为FirstActivity。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this, FirstActivity.class);
startActivity(intent);
}
}
下面是FirstActivity重写了几个生命周期方法
public class FirstActivity extends Activity {
private String TAG = "FirstActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Log.d(TAG, "onCreate: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: ");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
}
当我启动了FirstActivity 界面后看到的打印如下
我主要需要验证三种情况
- 当按下home按键后的打印
- 当启动一个dialog activity后的打印
- 按下返回键或手动调用finish()的打印
场景1的验证,以下是打印结果, 打印了onPause, onStop验证前面所讲
重新打开 activity打印如下: 验证了前面所讲
场景2的验证,首先创建一个dialo 风格的activity。创建的方式我不讲了,只改了主题为dialog样式。
<activity android:name=".views.DialogActivity"
android:theme="@style/Theme.AppCompat.Light.Dialog"></activity>
那我们来看看是否符合我们的猜想呢?前三个打印是创建红色背景activity,接着onPause是点击显示对话框按钮后弹出Dialog风格的activity
后调用。前面的说法也得到了验证。
场景三,按下返回键或调用finish()方法
mFinish = findViewById(R.id.btn_finish);
//省略了部分代码
mFinish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 手动调用finish()
finish();
}
});
先看按下返回键的打印:前三个是创建调用,后三个是按下返回键后调用。
接着看下手动调用finish,可以看到跟上面完全一样,这个我就不贴图啦!可以自行验证。
好了,到这里就已经对activity生命周期分析完了。代码很简单就不上传啦!如果需要的朋友可以私下联系我。