Activity的生命周期和启动模式详解
前言
Activity是Android四大组件之首,使用也最为频繁,翻译过来就是“活动”,也就是Android应用中一个个我们可见的页面。
1.1 Activity的生命周期全面解析
(1)onCreate——Activity被创建
做一些初始化工作,例如setContentView去加载界面布局,初始化数据等。
(2)onStart——Activity被启动
Activity已经可见,但还不能与用户交互。
(3)onRestart——Activity被重新启动
一般由不可见状态重新变成可见状态,onRestart方法就被调用。
(4)onResume——Activity可见并且可以交互
onStart可见其实Activity还在后台,其实还无法真实看到;onResume的时候Activity才显示到前台,我们才真实可见。
(5)onPause——Activity正在停止
正常情况下会紧接着调用onStop,此时可以做一些存储数据、停止动画等工作,注意不能太耗时。
(6)onStop——Activity即将停止
可以做一些稍微重量级的回收工作,同样不能太耗时。
(7)onDestory——Activity即将被销毁
这是Activity生命周期的最后一个回调,我们可以做一些回收工作和最终资源的释放。
补充说明:
(1)针对一个特定的Activity,第一次启动时的回调为:onCreate -> onStart -> onReasume
(2)当用户打开新的Activity或者切换到桌面的时候,回调为:onPause -> onStop;有一种特殊的情况,如果新打开的Activity采用了透明主题,那么当前的Activity就不会调用onStop
(3)当用户再次回到原Activity时,回调为:onResatrt -> onStart -> onReasume
(4)当用户按Back键回退时,回调为:onPause -> onStop -> onDestory
(5)当Activity被系统回收后再次打开,生命周期方法回调和(1)一样,注意只是生命周期方法一样,不代表所有的过程都一样。
(6)从整个生命周期来说,onCreate 和 onDestory是配对的,分别标识着Activity的创建和销毁,并且只会有一次调用。从Activity是否可见来说,onStart 和 onStop是配对的,随着用户的操作或者设备的屏幕点亮和熄灭,这两个方法可能被多次调用;从Activity是否在前台来说,onReasume 和 onPause是配对的,也会随着用户的操作或者设备的屏幕点亮和熄灭被多次调用。
注意:
1、onStart, onStop 和 onResume, onPause本质上没有太大区别;onStart, onStop是从Activity是否可见这个角度决定是否回调的,而onResume, onPause是从Activity是否位于前台这个角度来回调的。
2、当新启动一个Activity的时候,旧Activity的onPause方法会被先调用,然后才会启动新的Activity。
11-03 12:18:41.334 22730-22730/com.glp.activitychange D/MainActivity: onCreate
11-03 12:18:41.464 22730-22730/com.glp.activitychange D/MainActivity: onStart
11-03 12:18:41.464 22730-22730/com.glp.activitychange D/MainActivity: onResume
11-03 12:18:43.944 22730-22730/com.glp.activitychange D/MainActivity: onPause
11-03 12:18:43.994 22730-22730/com.glp.activitychange D/SecondActivity: onCreate
11-03 12:18:44.014 22730-22730/com.glp.activitychange D/SecondActivity: onStart
11-03 12:18:44.014 22730-22730/com.glp.activitychange D/SecondActivity: onResume
11-03 12:18:44.464 22730-22730/com.glp.activitychange D/MainActivity: onStop
代码示例:https://github.com/guolipeng1993/ActivityChange (Android Studio项目)
1.2 Activity的启动模式(LaunchMode)
(1)四种启动模式
standard:标准模式
系统默认模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。
singleTop:栈顶复用模式
在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,而是调用onNewIntent方法,通过此方法的参数读取当前请求的信息。
singleTask:栈内复用模式
在这种模式下,只要Activity在一个栈内存在,那么多次启动此Activity都不会重新创建实例,而是和singTop一样,系统调用onNewIntent方法,但singleTask默认具有clearTop的效果,如果栈内已经存在新Activity的实例,则会将该实例上面的所有Activity全部移出栈,使新Activity的实例位于栈顶位置。
singleInstance:单实例模式
在该模式下,新Activity会单独开启一个任务栈来存放实例对象。
(2)指定启动模式
a: 通过 AndroidManifest.xml 指定
<activity android:name=".MainActivity"
android:launchMode="singleTop"/>
b: 通过在Intent中设置标志来指定
Intent intent = new Intent(this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
本人能力有限,如果此博文中有哪里讲得让人难以理解,欢迎留言交流,若有讲解错的地方欢迎指出,大家互相学期,共同进步!