「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
默认规则: 在不同Task中打开同一个Activity,它会被创建多个实例,分别放进每一个Task,互不干扰;(比如在短信点击里新建联系人,再打开联系人app,发现互不相关)
有特殊逻辑:在短信里点击邮箱地址,直接跳转到邮箱APP;在ActivityManifest中将此app的lunchmod改为SingleTask就可以实现这样的功能;
会将邮箱app创建对象放进独立的Task中,再堆放在短信APP上面(不止Activity可以在Task中叠成栈,不同Task也可以叠加,Task叠加只提供给前台Task,前台Task进入后台时,第一时间就会被拆开,前台Task进入后台的最常见场景:按Home键回到桌面;按最近任务键查看最近任务。前台Task在最近任务列表显示出来的时候就已经进入后台,而不是在切换到其他应用之后,也就是当点击邮箱链接以后进入邮箱以后,按下最近任务列表查看最近任务,再回到邮箱APP界面,此时一直按返回键,就不会回退到短信APP内了,前台Task只剩一个了)
若不改变lunchmod,而是将allowTaskReparenting属性改为true,此时在短信里打开邮箱时,依然会进入到邮箱APP的Task里,但是稍后从桌面点击进入到邮箱APP里,放在短信里的Activity会被挪到邮箱APP的Task里,在回退栈顶端显示,再切回短信会发现Activity已经不见了(如果需要使用,需要做好测试android9,10可能不能用)
SingleTask:除了Activity在固定的Task里创建,还有保证如果此栈里已有此对象,那么就会复用这个已有的对象,不会再去创建新的对象,也就不会调用onCreate()方法,而是调用它的onNewIntent()方法,让他可以从intent里解析数据来刷新界面,在调用onNewIntent()之前,如果此Activity上面有压着其他的Activity,系统会将这些Activity全部弹出栈,既确保此Activity只出现在一个Task里,也保证者个Task里只有一个此Activity对象,(唯一性)
singleInstance:单一实例,行为逻辑与SingleTask基本一致,只是多了一个更严格的限制,要求这个Task中只有这一个Activity,不许有旧的,也不许有新的,例如将编写邮件的Activity设置为singleInstance,那么用户在短信里点击了邮箱地址后,会创建一个Activity对象和一个存放他的单独的Task,如果之前已经创建过这个Activity和Task,那么与singleTask一样会直接复用这个Activity,调用他的onNewIntent(),这个Task也会被压到短信Task上面,表现为切换APP的动画,(此时如果点击返回按钮,系统会直接回退到短信APPTask,如果没有直接点击返回按钮,而是按下最近任务键,查看最近任务列表,然后返回邮件APP的Task,再点返回,此时Task已经不堆叠,会直接返回到桌面;)如果此时再启动一个新的Activity,那么这个Activity会被放入新的Task中,一起压在最上面,(唯一性,独占性) 未完待续