对Activity启动模式的理解

  • 应用场景

    • 在已打开多个Activity应用B的前提下,应用A调用应用B后点击返回按钮,需要直接返回到A应用,而不是打开B应用的上一个Activity

一个Task可以理解为一个Activity栈,可以装载一个或多个Activity,回退和打开的顺序逻辑和基本的数据结构栈是一致的。

一个Application如果有N个Activity,这些Activity分布在M个任务栈中,那么Application的回退栈会遵循这样的原则:

  1. 首先从当前Activity在的Task回退,直到这个Task中再无记录
  2. 寻找下一个Task再次退回直到没有Activity
  3. 这个Task是在Application的总栈中有记载的,总是Task中最近使用的Activity相关

对SingleTask的理解

  1. 该启动模式建议和TaskAffinity一起使用,这样才能发挥这种加载模式的特殊逻辑效果。
  2. 当一个应用程序加载一个singleTask模式的Activity时,首先该Activity会检查是否存在与它的taskAffinity相同的Task。
    • 如果存在,那么检查是否实例化,如果已经实例化,那么销毁在Activity以上的Activity并调用onNewIntent。如果没有实例化,那么该Activity实例化并入栈
    • 如果不存在,那么就重新创建Task,并入栈

对SingleInstance的理解

  1. 当一个应用程序加载一个singleInstance模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈。如果已经被实例化,那么就调用该Activity的onNewIntent
  2. singleInstance的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其他Activity(比如Activity2)都会被放入其他的Task中,如果存在与Activity2相同的affinity的Task,则在该Task内创建Activity2.如果不存在,则重新生成新的Task并入栈

以上这些学习都是因为最近在做一个微信调起客户端的事情。如果自己的客户端处于运行状态,按下Home键后台挂起。此时如果使用微信调起自己的客户端某个页面,不做任何处理的情况下,按下回退或者当前Activity.finish(),页面都会停留在自己的客户端(因为自己的Application回退栈不为空),这明显不符合逻辑的。产品的要求是,回退必须回到微信客户端,而且要保证不杀死自己的Application.我的处理方案就是,设置当前被调起Activity的属性为:

LaunchMode=""SingleTask"

taskAffinity="com.tencent.mm"(com.tencent.mm是借助于工具找到的微信包名),就是把自己的Activity放到微信默认的Task栈里面,这样回退时就会遵循“Task只要有Activity一定从本Task剩余Activity回退"的原则,不会回到自己的客户端;而且也不会影响自己客户端本来的Activity和Task逻辑。

学习资料

  1. Android中Activity四种启动模式和taskAffinity属性详解

最新文章

  1. python之最强王者(2)——python基础语法
  2. CCF 201512-4 送货(错误)
  3. ZOJ Problem Set - 1109 Language of FatMouse
  4. Python学习 过程中零散知识点的总结
  5. l中断的实现
  6. Splay!
  7. 通过CSS让html网页中的内容不可选
  8. Spring-----Spring整合Struts2实例
  9. 【 bzoj4537】HNOI2016 最小公倍数
  10. Ubuntu 挂载硬盘分区
  11. excel下拉级联的做法
  12. tkinter第三章(单选和多选)RadioButton CheckButton
  13. 西邮linux兴趣小组2014纳新免试题(三)
  14. 可空类型 Nullable<T>
  15. springboot+cloud 学习(五)统一配置中心 spring cloud config + cloud bus + WebHooks +RibbitMQ
  16. win7中调试Hotspot
  17. C语言扫盲篇
  18. JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)
  19. SQL创建视图
  20. iOS 绘制一个表盘时钟,秒针效果可以“扫秒/游走”

热门文章

  1. HTML5新特性 websocket(重点)--多对多聊天室
  2. 201771010128王玉兰《面向对象程序设计(Java)》第八周学习总结
  3. hdu5967数学找规律+逆元
  4. 【git】git 常用命令(含删除文件)
  5. 基于Unity实现油画风格的着色器
  6. GC总结
  7. 附件2:async/await
  8. 循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理
  9. 完美解决报错Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'
  10. 深度学习玩LOL-游戏助手-概述