Android activity启动模式理解
程序员文章站
2022-08-03 12:45:46
这里我们引入《Android入门到精通》,activity组件说明,在Android应用程序中,一个activity表现形式为一个单独的界面,每一个Activity的类都是一个单独类,它扩展了Activity的基础类,这个类是有一个view组成用户界面,并响应事件,一个程序中包含多个activity。当它在打开或者切换另一个activity的时候,就是载入一个新的activity。 打开一个新的界面,上一个界面就是暂停,并放入历史的栈中,使用者可以回溯到前面已经打开的存放在......
这里我们引入《Android入门到精通》,activity组件说明,在Android应用程序中,一个activity表现形式为一个单独的界面,每一个Activity的类都是一个单独类,它扩展了Activity的基础类,这个类是有一个view组成用户界面,并响应事件,一个程序中包含多个activity。当它在打开或者切换另一个activity的时候,就是载入一个新的activity。
打开一个新的界面,上一个界面就是暂停,并放入历史的栈中,使用者可以回溯到前面已经打开的存放在历史栈中的界面。也可以删除历史栈中没有价值的界面。Android历史栈中保留程序中产生的所有界面:从第一个界面到最后一个。
Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance。(注意,这里说明是在竖屏的模式下开始测试的,不考虑横竖屏切换的情况下)
1.建立demo,生成A,B,C,D界面。每个页面的生命周期事件都log出来提示。
2.测试standard模式去启动这个四个界面:
启动A,重新打开A界面(我这里点击两次):
打印出来的各自的生命周期事件:
可以看出默认启动模式是,每一次去跳转一个activity都是去oncreate一个界面。
当我从A->B->C->D->A,点击返回按钮(A->D->C->B->A),事件是:
3.测试singleTop模式去启动这个四个界面:
文件清单添加;
android:launchMode="singleTop"
启动A,重新打开A界面(我这里点击两次):
singleTop与standard的启动模式是相似的,但是有一点不同的是,singleTop,将要启动的目标activity如果在栈顶时,系统将不会重新创建该activity的实例而是直接复用。
4.测试SingleTask 栈内复用模式去启动这个四个界面:
A->B->C->D->A:
LOG:
2020-07-03 14:09:33.203 16086-16086/com.example.test_01 I/A界面: onCreate
2020-07-03 14:09:33.205 16086-16086/com.example.test_01 I/A界面: onStart
2020-07-03 14:09:33.206 16086-16086/com.example.test_01 I/A界面: onResume
2020-07-03 14:09:56.207 16086-16086/com.example.test_01 I/A界面: onPause
2020-07-03 14:09:56.228 16086-16086/com.example.test_01 I/B界面: onCreate
2020-07-03 14:09:56.229 16086-16086/com.example.test_01 I/B界面: onStart
2020-07-03 14:09:56.231 16086-16086/com.example.test_01 I/B界面: onResume
2020-07-03 14:09:56.648 16086-16086/com.example.test_01 I/A界面: onStop
2020-07-03 14:10:10.651 16086-16086/com.example.test_01 I/B界面: onPause
2020-07-03 14:10:10.670 16086-16086/com.example.test_01 I/C界面: onCreate
2020-07-03 14:10:10.671 16086-16086/com.example.test_01 I/C界面: onStart
2020-07-03 14:10:10.672 16086-16086/com.example.test_01 I/C界面: onResume
2020-07-03 14:10:11.093 16086-16086/com.example.test_01 I/B界面: onStop
2020-07-03 14:10:22.405 16086-16086/com.example.test_01 I/C界面: onPause
2020-07-03 14:10:22.426 16086-16086/com.example.test_01 I/D界面: onCreate
2020-07-03 14:10:22.427 16086-16086/com.example.test_01 I/D界面: onStart
2020-07-03 14:10:22.429 16086-16086/com.example.test_01 I/D界面: onResume
2020-07-03 14:10:22.855 16086-16086/com.example.test_01 I/C界面: onStop
2020-07-03 14:10:34.844 16086-16086/com.example.test_01 I/B界面: onDestroy
2020-07-03 14:10:34.876 16086-16086/com.example.test_01 I/C界面: onDestroy
2020-07-03 14:10:34.892 16086-16086/com.example.test_01 I/D界面: onPause
2020-07-03 14:10:34.908 16086-16086/com.example.test_01 I/A界面: onRestart
2020-07-03 14:10:34.908 16086-16086/com.example.test_01 I/A界面: onStart
2020-07-03 14:10:34.909 16086-16086/com.example.test_01 I/A界面: onResume
2020-07-03 14:10:35.324 16086-16086/com.example.test_01 I/D界面: onStop
2020-07-03 14:10:35.324 16086-16086/com.example.test_01 I/D界面: onDestroy
可以看出,由于A界面已经启动了一次,当再次打开A时候,会将BCD依次去销毁。只保留A界面。
5.测试singleTop栈内复用模式去启动这个四个界面:
A->B->C->D->A->B:
可以看见,当我创建了界面的activity,当再次去打开的时候,也是不会去再次去创建,而是重启显示出来。
值得注意的一点是:SingleTask加载的activity会再同一个Task中只有一个实例,有三种情况:
1.启动的目标activity不存在,系统创建activity实例,并加入Task栈顶。
2.启动的目标activity存在,系统创建activity,但没有在Task栈顶,系统会把改activity上面的栈顶移出去,使目标activity转入栈顶。
3.启动的目标activity已经在栈顶了,就跟singleTop的一样。
SingleInstance,当系统保证无论哪个Task启动目标activity,只会创建一个实例,会启动全新的Task栈来装载目标activity。
这里分两种情况:
1.启动的目标activity不存在,系统创建新的Task,再创建activity实例,并加入新的Task栈顶。
2.启动的目标activity存在,无论存在哪个应用程序中,无论在哪个Task,系统都会在后台显示出来。
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例,所有一般开发中很少用到这种启动模式,但并不是没有使用。
本文地址:https://blog.csdn.net/qq_36771930/article/details/107100868
上一篇: 吃了人参对人体身体健康有什么好处?
下一篇: 高级php注入方法集锦第1/2页
推荐阅读
-
如何正确理解和使用Activity的4种启动模式
-
Android 中启动自己另一个程序的activity如何实现
-
Android 启动另一个App/apk中的Activity实现代码
-
Activity生命周期与启动模式图文解说
-
Android中Activity启动默认不显示输入法解决方法
-
Android 两种启动模式的实例详解
-
Activity的启动模式
-
Android-----Intent中通过startActivity(Intent intent )显式启动新的Activity
-
Android中点击按钮启动另一个Activity以及Activity之间传值
-
Android设计模式理解(mvc mvp mvvm)