默认规则
在不同的task中打开相同的activity,Activity会被创建多个实例,并放到不同的task当中。
SingleTask
主要是唯一性,保证只有一个task里又这个Acitivty,也保证了task里最多只有一个这个Acitivity。虽然叫single但是全局只有这一个对象。
如果task里不存该activity实例则创建,否则就通过onNewIntent()重新激活。
-
被启动的SingleTask Acitivty如果和启动它Activity的在同一个应用
存在会清空该SingleTask Acitivty上方的acitivty 不存在则新建
2.被启动的SingleTask Acitivty如果和启动它Activity的在同一个应用
如果已经存在则将该SingleTask Acitivty上方的acitivty清空,然后将task叠加在启动它的task上方,按下返回键会先清空SingleTask Acitivty所在task的所有acitivty。再到启动它的task。如果推到后台或者查看最近任务,这两个task也会拆开。如果回到singletask返回清空则到了桌面。
不存在则新建,逻辑大概和存在相似
allowTaskReparenting
一般一个activity只会跟一个task,不会跳来跳去,但是allowTaskReparenting可以让你这样做。
是否允许重新找爹,A和B两个App。A中的aActivty启动了B中的bActivty.
如果B是为启动,那么bActivity先会跟着启动它的栈,等B启动了,又随B去了,就像关羽跟曹操,刘备来了继续会跟随刘备。
如果B是已启动,我看栈的内容是,那么bActivity会一直跟着启动它的栈A,而不去找B。这里其实我是存疑的,没想通这样设计的目的,先挖坑。
过了3小时,坑埋了…..
如果B已启动,那么bActivity会跟着启动它的栈A,而不去找B。没错,如下图所示,但是
- 但是重新打开B的时候,bActivity依旧会奔向B。
这个allowTaskReparenting就不会像singletask一样,切到后台在回来,两个Task被拆开,导致返回就切断了自己的后路的问题。
但是注意这玩意在android 9 和10上坏的,慎用。
相当于在task上叠加,然后切到后台或者查看最近任务的时候被拆开了。一旦这样操作一直返回就会回到桌面。不这样操作,一直返回会到上一个task。
SingleInstance
除了和SingleTask唯一性还有独占性,保证task里只有我。
一个task只有它自己,依旧会压在调用它的task的上面。到后台依旧会被拆分。
由于SingleInstance一个task只能存在一个acitivty,
假设A应用打开了SingleInstance Activity,那么创建的SingleInstance Task B。
所以SingleInstance Activity创建新acitivity时,会新建一个task C,如果该activity原先就有task C,那么也会放到栈顶然后把原先task C一起叠在所以SingleInstance Activity Task B上。
按照顺序就是A B C
一般来说B和C的taskAffinity是一样的,但是最近任务只会显示一个taskAffinity,所以在最近任务里只会看到两个task A 和C。最近任务里看到的未必或者,看不到的未必就死了。
taskAffinity
**相当于对Acitivty的预先分组,默认取自于包名,**一般取自栈底的taskAffinity。
在taskAffinity的情况下启动activity Intent要new Task 否则不会创建新栈
如果配置了singletask也会去检查。相同则继续入栈,不同则会去寻找它的taskAffinity相同的task后入栈。
singletask和taskAffinity一起用也能将activity放到新栈
最近运行任务栈中只能显示一个taskAffinity的task
这些特性的目的
SingleTop App内部
SIngleInstance 更多是开放给外部App来共享使用
SIngleTask 内部交互和外部交互都会用得上
围绕任务启动和任务切换的问题。
栈和进程无关。
一个栈可以又多个进程的acitivty就像我上面举例的allowTaskReparenting
四种启动模式 和常见的标志位 。PMS时解析 启动模式啥的