Activity的四种启动模式

目录

一、相关知识

1.一个应用程序通常会有多个Activity,这些Activity都有一个对应的action(如MainActivity的action),可通过action来启动对应Activity(隐式启动)。

<action android:name="android.intent.action.MAIN" />

2.一个应用程序可以说由一系列组件组成,这些组件以进程为载体,相互协作实现App功能。

3.任务栈(Task Stack)或者叫退回栈(Back Stack)介绍:

任务栈用来存放用户开启的Activity
在应用程序创建之初,系统会默认分配给其一个任务栈(默认一个),并存储根Activity
同一个Task Stack,只要不在栈顶,就是onStop状态
任务栈的id自增长型,是Integer类型
新创建Activity会被压入栈顶。点击back会将栈顶Activity弹出,并产生新的栈顶元素作为显示界面(onResume状态)
当Task最后一个Activity被销毁时,对应的应用程序被关闭,清除Task栈,但是还会保留应用程序进程,再次点击进入应用会创建新的Task栈。

4.Activity的affinity:

affinity是Activity内的一个属性(在ManiFest中对应属性为taskAffinity)。默认情况下,拥有相同affinity的Activity属于同一个Task中
Task也有affinity属性,它的affinity属性由根Activity(创建Task时第一个被压入栈的Activity)决定
在默认情况下,所有的Activity的affinity都从Application继承。也就是说Application同样有taskAffinity属性
4Application默认的affinity属性为Manifest的包名。

二、Activity启动模式:

1.默认启动模式——standard

Activity的默认模式就是standard。在该模式下,启动的Activity会依照启动顺序被依次压入Task中:

2.栈顶复用模式——singleTop

在该模式下,如果栈顶Activity为我们要新建的Activity(目标Activity),那么就不会重复创建新的Activity。

3.栈内复用模式——singleTask

与singleTop模式相似,只不过singleTop模式是只是针对栈顶的元素,而singleTask模式下,如果task栈内存在目标Activity实例,将task内的对应Activity实例之上的所有Activity弹出栈, 将对应Activity置于栈顶,获得焦点。

4.全局唯一模式——singleInstance

在该模式下,我们会为目标Activity分配一个新的affinity,并创建一个新的Task栈,将目标Activity放入新的Task,并让目标Activity获得焦点。新的Task有且只有这一个Activity实例。 如果已经创建过目标Activity实例,则不会创建新的Task,而是将以前创建过的Activity唤醒(对应Task设为Foreground状态)

三、动态设置启动模式

上述所有情况,在Manifest中通过launchMode属性设置,被称为静态设置,动态的设置Activity启动方式(如果同时有动态和静态设置,那么动态的优先级更高)。

动态设置是通过设置要启动的Activity的启动模式:

intent.setFlags(...);

几个常见的Flag:

1、NEW_TASK

Intent.FLAG_ACTIVITY_NEW_TASK

与singleInstance很相似:在给目标Activity设立此Flag后,会根据目标Activity的affinity进行匹配,如果已经存在与其affinity相同的task,则将目标Activity压入此Task。 反之没有的话,则新建一个task,新建的task的affinity值与目标Activity相同。然后将目标Activity压入此栈。

2、SINGLE_TOP

Intent.FLAG_ACTIVITY_SINGLE_TOP

与静态设置中的singleTop效果相同

2.3.CLEAR_TOP

Intent.FLAG_ACTIVITY_CLEAR_TOP

与singleTask相似当设置此Flag时,目标Activity会检查Task中是否存在此实例,如果没有则添加压入栈,如果有,就将位于Task中的对应Activity其上的所有Activity弹出栈,此时有以下两种情况:

如果同时设置Flag_ACTIVITY_SINGLE_TOP,则直接使用栈内的对应Activity,
没有设置,则将栈内的对应Activity销毁重新创建。
    原文作者:瑾珮
    原文地址: https://blog.csdn.net/weixin_44870139/article/details/112734363
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞