博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Activiity的四种启动方式(launchMode)
阅读量:6219 次
发布时间:2019-06-21

本文共 2454 字,大约阅读时间需要 8 分钟。

这个知识估计快被人写烂了,但是为了自己印象深刻,我还是要自己写一次。>.<

注:文中cls都是Activity的class对象

1.standard

系统默认的启动方式,每次启都会创建一个新的Activity实例,一个任务栈允许多个该Activity实例存在,被启动的Activity自动放入启动它的Activity的任务栈,比如任务栈1中Activity A启动了Activity B,则B自动放入任务栈1

AndroidManifest.xml

复制代码

Java代码

context是Activity实例

Intent intent = new Intent(context,  cls);context.startActivity(intent);复制代码

context不是Activity实例 注意:该Activity的taskAffinity必须为默认值或者不设置

Intent intent = new Intent(context,  cls);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);复制代码

2.singleTop

该启动方式下,如此该Activity的没有实例在任务栈,则创建一个实例放入栈顶;如果有实例在任务栈,但不在栈顶,则再创建一个实例放入栈顶;如果有实例在任务栈,且在栈顶,则不再创建实例。

任务栈1有A、B、C三个Activity,如果从栈底到栈顶的顺序为[A,B,C],singleTop方式启动C,则不再创建C的实例;如果从栈底到栈顶的顺序为如果从栈底到栈顶的顺序为[A,C,B],启动C,则重新创建一个C的实例,并放入栈顶[A,C,B,C]。

AndroidManifest.xml

复制代码

Java代码

context是Activity实例

Intent intent = new Intent(context,  cls);intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);context.startActivity(intent);复制代码

context不是Activity实例

Intent intent = new Intent(context,  cls);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);context.startActivity(intent);复制代码

3.singleTask

这是一种Activity的栈内单例模式,即只要该Activity所在任务栈有一个实例存在,启动它的时候都不会再次创建。启动这个Activity的时候,如果它的任务栈里没有这个Activity的实例存在,就会创建一个实例并压入它的任务栈顶;如果它的任务栈已经存在这个Activity的实例,就会清空这个任务栈所有在该Activity前面的Activity。

任务栈1有从栈底到栈顶的顺序为**[A,B,C],singleTask方式启动D,则创建D实例,放入任务栈1[A,B,C、D]任务栈1有从栈底到栈顶的顺序为[A,B,C]singleTask方式启动B,则不创建A实例,清空A上的所有Activity,任务栈变为[A,B]**。

AndroidManifest.xml

复制代码

Java代码

context是Activity实例

Intent intent = new Intent(context,  cls);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);context.startActivity(intent);复制代码

context不是Activity实例

Intent intent = new Intent(context,  cls);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);context.startActivity(intent);复制代码

4.singleInstance

这是一种Activity的单例模式,拥有singleTask的所有特性,并且这种启动方式启动的Activity,系统会为它创建一个独立的任务栈,这个任务栈只允许该Activity存在。

这里特别说明下这种情况回退栈,三种状态对应的回退栈是:
橘色的是任务栈1的Activity,蓝色是任务栈2的Activity,可以看出开始回退栈是[A,B,C],也就是按返回键退出的顺序依次是C、B、A;启动D,D在前台,ABC 在后台,回退栈是[A,B,C,D];启动E,E属于任务栈1,E在前台,任务栈1也就在前台,同任务栈的A、B、C的回退栈顺序也就跟着提到了D之前,回退栈顺序也就变成了[D,A,B,C,E],按返回键退出Activity的顺序也就变成了E,C,B,A,D。

AndroidManifest.xml

复制代码

Java代码

context是Activity实例

没找到复制代码

context不是Activity实例

没找到复制代码

另:onNewIntent(Intent intent)

该方法跟启动方式有关,当Activity的启动方式是singleTop、singleTask或者singleInstance时,如果不需要重创建实例,则调用已存在实例的onNewIntent(Intent intent) ,新的Intent传入onNewIntent(Intent intent)。

转载地址:http://hymja.baihongyu.com/

你可能感兴趣的文章
vue2.0学习笔记(第四讲)(生命周期函数、vue实例的简单方法、自定义指令)...
查看>>
Substring with Concatenation of All Words
查看>>
python进阶笔记【2】 --- 一个奇怪的 __future__ 库
查看>>
MVC学习笔记
查看>>
开始使用GraphQL
查看>>
node - 收藏集 - 掘金
查看>>
Java将枚举序列化为对象
查看>>
数据结构-BF算法及KMP算法
查看>>
HTML5 进阶系列:web Storage
查看>>
WatchService实现配置文件变更监听
查看>>
2017 Node.js 开发框架比较
查看>>
Python中Mock和MagicMock的区别
查看>>
Laravel 5.4 入门系列 7. 文章的显示
查看>>
明月的 WordPress 优化思路总结
查看>>
Amazon DynamoDB 入门6:query 和 scan
查看>>
Mac OS X and python “ValueError: unknown locale: UTF-8”
查看>>
理解CSRF跨站请求伪造
查看>>
被误解的MVC和被神化的MVVM
查看>>
DevOps日常:别人家的运维这样过
查看>>
中台之上(一):重视业务架构,不要让“业务的归业务、技术的归技术”
查看>>