这部分的想法都是基于以下两点:

1.Activity可能被复用,可能是复用Activity的功能,还可能是复用Activity的状态;

2.Task的作用:target,同一个task中的Activity服务于相同的或者接近的目标(target)。

(一个task的目标往往由task的root Activity决定,因为是root Activity造就了这个task)。

Activity复用情景1

在当前App中,通过Intent,打开了当前App或其他App的一个Activity(standard或singleTop),则这个Activity变成当前task的一部分。

即:在当前task中打开了一个activity

使用理由:

为了完成task的目标,需要新的Activity的完全参与进来,需要它成为task的一部分,可以这样子复用;

Activity复用情景2

在当前App中,通过Intent,使用FLAG_ACTIVITY_NEW_TASK打开了当前App(新Activity的task_affinity与当前app中其他Activity不同)或其他App的一个Activity(非singleInstance),

1. 假如这个Activity没有被打开过,且没有一个task的affinity与这个Activity相同,则这个Activity变为新的task的root Activity,创建了一个新的task。

2. 如果有其他的task的affinity与这个Activity相同,则会将旧的task调起,将这个Activity在这个task中打开,

3.假如这个Activity已经被打开过,则会将旧的task调起,如果配合FLAG_ACTIVITY_CLEAR_TOP标签,新的Activity以上的Activity会被销毁,也就是打开了一个全新的Activity以供复用。

4. 如果要打开的Activity为singleTask,不论有没有加FLAG_ACTIVITY_CLEAR_TOP标签,都有上层Activity出栈的效果。

以上四种情况都可以归纳为在新的task中打开了要复用的Activity

使用理由:

为了完成task的目标,需要用到新的Activity,但是这个Activity的功能,与原来task的目标有一定差距,体验上是一个新的功能,则需要创建一个独立的task,在这个task完成它的任务后,旧的task可能就不关心这个task了(比如新的task中的activity只是显示一个通知,让用户看一眼,看完就可以不管),或者,新的Activity不应该过度参与到旧的task中,(比如通知看完了就不应该再存在在task中),这种情况下就可以这样复用。

与第一种复用情形还有一个区别,这个Task中的Activity在被销毁前是可以被其他task重用的。

Activity复用情景3

在当前App中,通过Intent,打开了一个SingleInstance的Activity,会创建一个新的task,且新的task中永远只有一个Activity。

使用理由:

与复用情形2一样,因为新的Activity的功能与原来的task的目标有一定差距,所以不能视为同一个task,所以要在新的task中打开这个Activity。

但与情形2不同的是,情形2中,旧的task不关心打开的新Activity,但打开的新Activity所在的task,可以继续创建Activity为新task的目标服务(比如添加附件功能)。

 

而在情形3中,新的task只有一个目标,就是发挥当前Activity的功能。不愿过多地执行更多功能,就需要使用singleInstance的模式。(比如打电话就是纯粹的打电话,打完电话该做什么不是打电话所在的这个task该关心的)

另一方面,新的task在被复用的时候,不会增加Activity,也可以保证其他task重用这个task的时候,不会受到其他task复用时新增Activity的影响

情形2和情形3使得创建后的Activity可以被复用,节省了创建时的开销。

FLAG_ACTIVITY_NEW_TASK和SingleInstance的设计思路(多task的应用)的更多相关文章

  1. GDC2016 [全境封锁],11个种类5个派系的敌人设计思路

    [汤姆克兰西:全境封锁],11个种类5个派系的敌人设计思路 实现[汤姆克兰西]射击RPG的AI开发   日文链接:http://game.watch.impress.co.jp/docs/news/2 ...

  2. jMiniLang设计思路

    前言 项目地址:https://github.com/bajdcc/jMiniLang 演示视频:https://www.bilibili.com/video/av13294962 jMiniLang ...

  3. Netty服务器连接池管理设计思路

    应用场景: 在RPC框架中,使用Netty作为高性能的网络通信框架时,每一次服务调用,都需要与Netty服务端建立连接的话,很容易导致Netty服务器资源耗尽.所以,想到连接池技术,将与同一个Nett ...

  4. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  5. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  6. ENode框架单台机器在处理Command时的设计思路

    设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...

  7. WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...

  8. OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  9. Redis入门指南(第2版) Redis设计思路学习与总结

    https://www.qcloud.com/community/article/222 宋增宽,腾讯工程师,16年毕业加入腾讯,从事海量服务后台设计与研发工作,现在负责QQ群后台等项目,喜欢研究技术 ...

随机推荐

  1. 南阳师范学院ACM集训队博客使用方法

    南阳师范学院ACM集训队博客使用方法 为方便大家交流,我们使用的是同一个用户名和密码,所以请不要随意修改用户名和密码,不然大家都登不上了,谢谢! 首先进入主页:http://www.cnblogs.c ...

  2. MySQL取得当前时间的函数是什么 格式化日期的函数是什么

    取得当前时间用 now() 就行.在数据库中格式化时间 用DATE_FORMA T(date, format) .根据格式串format 格式化日期或日期和时间值date,返回结果串. 可用DATE_ ...

  3. ps切片

    (一)我们需要把中间的图切成一块一块. 首先在放入PS中: [视图]——>[标尺],为的是能够精确的切图: 标尺打开后上下左右都可以往图中拉线,我们在这边叫作(参考线),然后使用左边的[放大镜] ...

  4. 在MySQL数据库建立多对多的数据表关系

    在数据库中,如果两个表的之间的关系为,多对多的关系,如:“学生表和课程表”,一个学生的可以选多门课,一门课也可以被多门学习选;根据数据库的设计原则,应当形成第三张关联表 步骤1:创建三张数据表Stud ...

  5. Python学习路径和个人增值(整合版)

    PS:内容来源于网络 一.简介         Python是一种面向对象.直译式计算机程序设计语言,由Guido van Rossum于1989年底发明.由于他简单.易学.免费开源.可移植性.可扩展 ...

  6. 嵌入式平台组件白盒测试gcov、lcov和genhtml 使用指导

    在嵌入式平台上使用了gtest白盒测试工具,覆盖了被测函数,但是不知道自己测试的效果如何,测试行覆盖率.函数覆盖率,分支覆盖率的数据. 便开始研究gcov这个代码覆盖率工具能否使用,来检查白盒测试的效 ...

  7. nginx+redis 实现 jsp页面缓存,提升系统吞吐率

    最近在开发的时候,发现之前APP客户端的一部分页面用的是webview交互,这些页面请求很多,打开一套试卷,将会产生100+的请求量,导致系统性能下降.于是考虑在最靠近客户端的Nginx服务器上做Re ...

  8. Hessian Servlet和Hessian Spring的简单应用

    转自: http://lancui.iteye.com/blog/935578 简介 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议(Binary),因为采用的是二进制 ...

  9. SMO要点总结

    SMO要点总结: SMO使用坐标上升的方法,求解SVM的最优解.和原始坐标上升方法的不同点在于: 1.       由于SVM的限制条件 ,所以不能只使用一个坐标,改为更新两个 2.       采用 ...

  10. python升级导致的坑

    问题来源 问题往往都是这样来的突然,让我措手不及. 小孩没娘说来话长啊,操作系统是centos6.5因此默认自带的python是2.6.6的,突然有一天我要写一个关于kafka topic消费情况的监 ...