Activity启动模式呕心沥血扒开现象看本质版本

默认规则

在不同的task中打开相同的activity,Activity会被创建多个实例,并放到不同的task当中。

SingleTask

主要是唯一性,保证只有一个task里又这个Acitivty,也保证了task里最多只有一个这个Acitivity。虽然叫single但是全局只有这一个对象。

如果task里不存该activity实例则创建,否则就通过onNewIntent()重新激活。

  1. 被启动的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去了,就像关羽跟曹操,刘备来了继续会跟随刘备。

image.png

如果B是已启动,我看栈的内容是,那么bActivity会一直跟着启动它的栈A,而不去找B。这里其实我是存疑的,没想通这样设计的目的,先挖坑。

过了3小时,坑埋了…..

如果B已启动,那么bActivity会跟着启动它的栈A,而不去找B。没错,如下图所示,但是
image.png

  • 但是重新打开B的时候,bActivity依旧会奔向B。

image.png

这个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

image.png

四种启动模式 和常见的标志位 。PMS时解析 启动模式啥的

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYNYgEnm' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片