不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对应于其生命周期中特定阶段的特定回调方法在 Activity 实例中启动代码。有一系列可启动 Activity 的回调方法,以及一系列可分解 Activity 的回调方法。
本篇我们就通过几个常见的场景来看一下Activity的是生命周期。下面是一张关于其生命周期的图,大家可以参考以下。
从这幅图中我们可以看出,android程序的启动最初是应该是onCreate->onStart->onResume这三个经过,然后在Rusumed状态等待状态变化。
那么我们通过程序实际看一下,运行过程是否和我们想象的一致。
首先,我们定义一个log打印函数,输出进入对应的生命周期的时间和是哪一个过程。
private void refreshActivityLife(String desc)
{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
mStr = String.format("%s:%s at %s\n",TAG,desc,simpleDateFormat.format(date));
textView.append(mStr);
Log.d(TAG,mStr);
}
接下来,我们实现与Activity相关的方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.android_life);
button = findViewById(R.id.jump_bttton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,JumpActivity.class);
startActivity(intent);
}
});
refreshActivityLife("onCreate");
}
@Override
protected void onStart() {
refreshActivityLife("onStart");
super.onStart();
}
@Override
protected void onStop() {
refreshActivityLife("onStop");
super.onStop();
}
@Override
protected void onResume() {
refreshActivityLife("onResume");
super.onResume();
}
@Override
protected void onPause() {
refreshActivityLife("onPause");
super.onPause();
}
@Override
protected void onRestart() {
refreshActivityLife("onRestart");
super.onRestart();
}
@Override
protected void onDestroy() {
refreshActivityLife("onDestroy");
super.onDestroy();
}
这里我们在说明一下各个方法:
- onCreate
这个不用多说,只要我们新建一个activity,必定会看到这个方法。显而易见,这个是activity的入口方法。
该方法是用来创建页面的,在这个过程中把页面上的各个元素都加载到内容中去。 - onStart
开始页面,把页面显示在屏幕上去 - onStop
停止页面,把页面从屏幕上撤下 - onResume
-恢复页面,让页面在屏幕上活动 - onPause
暂停页面,让页面在屏幕上的动作停止 - onRestart
重启页面,重新加载内存中的页面数据 - onDestroy
销毁页面,将页面从内存中删除
我们首先启动程序,查看logcat输出:
07-14 02:22:20.706 30700-30700/com.liusir.activitysimple D/MainActivity: MainActivity:onCreate at 2018年07月14日 02:22:20
07-14 02:22:20.708 30700-30700/com.liusir.activitysimple D/MainActivity: MainActivity:onStart at 2018年07月14日 02:22:20
07-14 02:22:20.712 30700-30700/com.liusir.activitysimple D/MainActivity: MainActivity:onResume at 2018年07月14日 02:22:20
接下来我们就常用的几个场景进行演示:
- 页面跳转
首先我们从MainActivity跳转至JumpActivity:
07-14 02:25:58.350 919-919/com.liusir.activitysimple D/MainActivity: MainActivity:onPause at 2018年07月14日 02:25:58
07-14 02:25:58.431 919-919/com.liusir.activitysimple D/JumpActivity: JumpActivity:onCreate at 2018年07月14日 02:25:58
07-14 02:25:58.433 919-919/com.liusir.activitysimple D/JumpActivity: JumpActivity:onStart at 2018年07月14日 02:25:58
07-14 02:25:58.439 919-919/com.liusir.activitysimple D/JumpActivity: JumpActivity:onResume at 2018年07月14日 02:25:58
07-14 02:25:59.183 919-919/com.liusir.activitysimple D/MainActivity: MainActivity:onStop at 2018年07月14日 02:25:59
大家可以看到,首先是将MainActivity暂停,然后开始加载JumpActivity,等待JumpActivity加载完成后,将MainActivity从屏幕撤下去。
此时,如果我们在返回主页面:
07-14 02:27:45.263 919-919/com.liusir.activitysimple D/JumpActivity: JumpActivity:onPause at 2018年07月14日 02:27:45
07-14 02:27:45.326 919-919/com.liusir.activitysimple D/MainActivity: MainActivity:onRestart at 2018年07月14日 02:27:45
07-14 02:27:45.350 919-919/com.liusir.activitysimple D/MainActivity: MainActivity:onStart at 2018年07月14日 02:27:45
07-14 02:27:45.377 919-919/com.liusir.activitysimple D/MainActivity: MainActivity:onResume at 2018年07月14日 02:27:45
07-14 02:27:45.932 919-919/com.liusir.activitysimple D/JumpActivity: JumpActivity:onStop at 2018年07月14日 02:27:45
07-14 02:27:45.963 919-919/com.liusir.activitysimple D/JumpActivity: JumpActivity:onDestroy at 2018年07月14日 02:27:45
这里也很清楚了,首先是将当前页面暂停,然后重新加载主页面,最后销毁当前页面。
- 横屏和竖屏切换
这里我们的流程如下:
首先进入程序是竖屏:
07-14 02:30:51.013 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onCreate at 2018年07月14日 02:30:50
07-14 02:30:51.016 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onStart at 2018年07月14日 02:30:51
07-14 02:30:51.022 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onResume at 2018年07月14日 02:30:51
切换屏幕至横屏:
07-14 02:32:45.115 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onPause at 2018年07月14日 02:32:45
07-14 02:32:45.153 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onStop at 2018年07月14日 02:32:45
07-14 02:32:45.176 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onDestroy at 2018年07月14日 02:32:45
07-14 02:32:45.634 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onCreate at 2018年07月14日 02:32:45
07-14 02:32:45.664 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onStart at 2018年07月14日 02:32:45
07-14 02:32:45.738 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onResume at 2018年07月14日 02:32:45
可以看出,切换屏幕会导致activity重新创建,那么在切换至竖屏应该也是同样的过程。
最后我们看下home键返回app:
07-14 02:36:02.576 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onPause at 2018年07月14日 02:36:02
07-14 02:36:02.781 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onStop at 2018年07月14日 02:36:02
此时程序处于暂停状态,我们返回app:
07-14 02:36:58.851 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onRestart at 2018年07月14日 02:36:58
07-14 02:36:58.872 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onStart at 2018年07月14日 02:36:58
07-14 02:36:58.895 5188-5188/com.liusir.activitysimple D/MainActivity: MainActivity:onResume at 2018年07月14日 02:36:58
那么我们点击返回时,状态是怎么变换的呢?
07-14 02:38:37.519 11582-11582/com.liusir.activitysimple D/MainActivity: MainActivity:onPause at 2018年07月14日 02:38:37
07-14 02:38:38.187 11582-11582/com.liusir.activitysimple D/MainActivity: MainActivity:onStop at 2018年07月14日 02:38:38
07-14 02:38:38.215 11582-11582/com.liusir.activitysimple D/MainActivity: MainActivity:onDestroy at 2018年07月14日 02:38:38
页面被销毁了。
好了,关于生命周期我们暂时就说到这里了。仅凭这么点说明大家是不可能完全理解的,让我们一起慢慢学习吧。