前言
虽然了解activity的四种启动模式,但是在一些复杂场景下,各种启动模式会出现的现象,以及现象的原因并不清楚,再加上个taskAffinity launchMode clearTaskOnLaunch 这些参数会使得更加懵逼。所以根据在实际应用中遇到的问题总结一下。
主要内容
要讲启动模式需要从Task ,taskAffinity 以及launchMode,还有标签四个方面入手,看这四个之前的关联以及影响。
Task
task跟activity的启动息息相关,因为activity启动后都是放在task里面进行管理的,task的数据结构是stack的,先进后出,新创建的activity放在task的顶部,如下图打开ActivityA->activityB->activityC: task的特点:
- activity的集合
- 以栈的形式对activity进行管理(back stack)
- task里面至少包含一个activity
- 新创建的activity放在栈顶。
- 每一个task都有称为Affinity的name。
TaskAffinity
taskAffinity是activity可以在manifest文件里面设置的属性.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.coroutinescopedemo">
<application android:allowBackup="true">
<activity
android:name=".MainActivity"
android:taskAffinity="hanking.edu">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
复制代码
用来确定启动的activity属于哪个task,或者确定task的名称。具体的功能如下:
-
用来决定持有activity的task是哪个。
-
默认情况下一个app里面的activity都有相同的affinity值(package name)
-
task的affinity值由触发创建task的activity的affinity值决定。(也被称为root activity)
taskAffinity用来确定activity所在栈的名字,是不是任何时候都会生效?看下默认情况下的两个activity设置不同的affinity会发生什么情况。
1、给activity设置task affinity 如下创建了activityA和activityB,其中给activityB设置了task Affinity值为com.something.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.myApp">
<application
android:allowBackup=&