Android 启动模式总结(一)
学而不思则罔,思而不学则殆
Activity是Android四大组件之一,是用户能直接感受的组件。
Activity有四种启动模式
四种启动模式
启动模式 | 说明 | 栈 |
---|---|---|
android:launchMode=“standard” | 普通模式(默认默认),每次都会新建 | 同一栈内 |
android:launchMode=“singleTop” | 栈顶复用 | 同一栈内 |
android:launchMode=“singleTask” | 栈内复用 | 同一栈内 |
android:launchMode=“singleInstance” | 全局唯一 | 不同栈内 |
standard
默认的启动模式,就是但你startActivity的时候都会重新创建一个新的Activity
启动三个AActivity的效果如下:
adb shell dumpsys activity p com.example.handlerstudy | grep ActivityRecord
- ActivityRecord{89c00da u0 com.example.handlerstudy/.AActivity t303}
- ActivityRecord{5c1423e u0 com.example.handlerstudy/.AActivity t303}
- ActivityRecord{d785648 u0 com.example.handlerstudy/.AActivity t303}
singleTop
栈顶复用,当启动的Activity是位于栈顶的时候不在重新create一个,直接复用,走声明周期方法是onNewIntent
有两个Activity,A和B,B是singleTop
当A启动B,B再启动B的时候不会新建一个B,而是直接复用B
有两个Activity,A和B,B是singleTop
A启动B,B启动A,A再启动B的时候,不会复用会直接在新建一个B
因为B没有在栈顶,不会复用
singleTask
栈内复用,意思是只要站内有就复用,并且把复用的Activity之上的所有Activity都出栈
有三个Activity,A,B,C,A是singleTask,BC都是普通启动模式
A启动B
B启动C
C再启动A,这个时候栈内存在A,会复用,并把BC出栈
可以看一下生命周期:
2020-07-11 19:53:51.787 18621-18621/com.example.handlerstudy D/zhangyu.AActivity: start BActivity //A启动B
2020-07-11 19:53:51.820 18621-18621/com.example.handlerstudy D/zhangyu.AActivity: onPause
2020-07-11 19:53:51.845 18621-18621/com.example.handlerstudy D/zhangyu.BActivity: onCreate
2020-07-11 19:53:51.871 18621-18621/com.example.handlerstudy D/zhangyu.BActivity: onStart
2020-07-11 19:53:51.873 18621-18621/com.example.handlerstudy D/zhangyu.BActivity: onResume
2020-07-11 19:53:52.255 18621-18621/com.example.handlerstudy D/zhangyu.BActivity: start CActivity //B启动C
2020-07-11 19:53:52.285 18621-18621/com.example.handlerstudy D/zhangyu.BActivity: onPause
2020-07-11 19:53:52.315 18621-18621/com.example.handlerstudy D/zhangyu.CActivity: onCreate
2020-07-11 19:53:52.345 18621-18621/com.example.handlerstudy D/zhangyu.CActivity: onStart
2020-07-11 19:53:52.346 18621-18621/com.example.handlerstudy D/zhangyu.CActivity: onResume
2020-07-11 19:53:52.538 18621-18621/com.example.handlerstudy D/zhangyu.AActivity: onStop
2020-07-11 19:53:52.894 18621-18621/com.example.handlerstudy D/zhangyu.BActivity: onStop
2020-07-11 19:53:53.862 18621-18621/com.example.handlerstudy D/zhangyu.CActivity: start AActivity //C启动A
2020-07-11 19:53:53.954 18621-18621/com.example.handlerstudy D/zhangyu.CActivity: onPause
2020-07-11 19:53:53.987 18621-18621/com.example.handlerstudy D/zhangyu.BActivity: onDestroy //B出栈
2020-07-11 19:53:54.019 18621-18621/com.example.handlerstudy D/zhangyu.AActivity: onRestart
2020-07-11 19:53:54.021 18621-18621/com.example.handlerstudy D/zhangyu.AActivity: onStart
2020-07-11 19:53:54.022 18621-18621/com.example.handlerstudy D/zhangyu.AActivity: onNewIntent //A复用
2020-07-11 19:53:54.022 18621-18621/com.example.handlerstudy D/zhangyu.AActivity: onResume
2020-07-11 19:53:54.554 18621-18621/com.example.handlerstudy D/zhangyu.CActivity: onStop
2020-07-11 19:53:54.561 18621-18621/com.example.handlerstudy D/zhangyu.CActivity: onDestroy //C出栈
singleInstance
Activity在手机中存在唯一一个实例,且跟其他的Activity不在同一个栈中
有三个Activity,A,B,C,C是singleInstance,AB都是普通启动模式
A启动B
B启动C,C在新的栈中
C在启动C,直接复用
C启动B
生命周期如下:
2020-07-11 20:09:25.968 19133-19133/com.example.handlerstudy D/zhangyu.AActivity: onCreate
2020-07-11 20:09:25.987 19133-19133/com.example.handlerstudy D/zhangyu.AActivity: onStart
2020-07-11 20:09:25.987 19133-19133/com.example.handlerstudy D/zhangyu.AActivity: onResume
2020-07-11 20:09:28.511 19133-19133/com.example.handlerstudy D/zhangyu.AActivity: start BActivity //A启动B
2020-07-11 20:09:28.546 19133-19133/com.example.handlerstudy D/zhangyu.AActivity: onPause
2020-07-11 20:09:28.579 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: onCreate
2020-07-11 20:09:28.600 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: onStart
2020-07-11 20:09:28.600 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: onResume
2020-07-11 20:09:29.153 19133-19133/com.example.handlerstudy D/zhangyu.AActivity: onStop
2020-07-11 20:09:29.503 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: start CActivity //B启动C
2020-07-11 20:09:29.537 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: onPause
2020-07-11 20:09:29.626 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: onCreate
2020-07-11 20:09:29.648 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: onStart
2020-07-11 20:09:29.649 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: onResume
2020-07-11 20:09:30.355 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: onStop
2020-07-11 20:09:33.162 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: start CActivity //C启动C
2020-07-11 20:09:33.194 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: onPause
2020-07-11 20:09:33.194 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: onNewIntent //复用C
2020-07-11 20:09:33.194 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: onResume
2020-07-11 20:09:34.917 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: start BActivity //C启动B
2020-07-11 20:09:34.958 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: onPause
2020-07-11 20:09:34.978 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: onCreate
2020-07-11 20:09:35.002 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: onStart
2020-07-11 20:09:35.002 19133-19133/com.example.handlerstudy D/zhangyu.BActivity: onResume
2020-07-11 20:09:35.849 19133-19133/com.example.handlerstudy D/zhangyu.CActivity: onStop
应用栈的情况:
Activities:
- ActivityRecord{42023ab u0 com.example.handlerstudy/.AActivity t326}
- ActivityRecord{58634ac u0 com.example.handlerstudy/.BActivity t326}
- ActivityRecord{392d512 u0 com.example.handlerstudy/.CActivity t327}
- ActivityRecord{22ce3d2 u0 com.example.handlerstudy/.BActivity t326}
可以看到C在t327 AB在t326,属于不同的栈
此时按返回键是什么情况呢?
按返回键-》B回到B->按返回键-》B回到A->按返回键,此时t326中没有其他的Activity了,这个时候会退回到C->按返回键-》退出应用