梦里风林
  • Introduction
  • Android
    • activity
      • Activity四种启动模式
      • Intent Flag
      • 多task的应用
      • Task和回退栈
    • sqlite
      • 【源码】CursorWindow读DB
      • Sqlite在Android上的一个Bug
    • Chromium
    • ListView读取DB数据最佳实践
    • Android Project结构
    • 一个由Proguard与FastJson引起的血案
    • 琐碎的一些tips
  • Computer Vision
    • 特征提取
    • 三维视觉
    • 计算机视觉常用工具
    • 浅谈深度学习数据集设计
    • 随笔
  • Machine Learning
    • 技巧
      • FaceBook: 1 hour training ImageNet
      • L2 Norm与L2 normalize
    • 实践
      • Pytorch实验代码的亿些小细节
    • 工具
      • Tensorflow学习笔记
      • MXNet踩坑手记
      • PyTorch踩坑手记
      • PyTorch模型剪枝
      • Keras踩坑手记
      • mscnn
      • Matlab
        • Matlab Remote IPC自动化数据处理
    • Papers
      • Classification
      • Re-identification
        • CVPR2018:TFusion完全解读
        • ECCV2018:TAUDL
        • CVPR2018:Graph+reid
        • Person Re-identification
        • CVPR2016 Re-id
        • Camera topology and Person Re-id
        • Deep transfer learning Person Re-id
        • Evaluate
      • Object Detection
        • 读论文系列·干货满满的RCNN
        • 读论文系列·SPP-net
        • 读论文系列·Fast RCNN
        • 读论文系列·Faster RCNN
        • 读论文系列·YOLO
        • 读论文系列·SSD
        • 读论文系列·YOLOv2 & YOLOv3
        • 读论文系列·detection其他文章推荐
      • Depth
      • 3D vision
        • 数据集相关
        • 光流相关
      • Hashing
        • CVPR2018: SSAH
      • 大杂烩
        • CNCC2017 琐记
        • ECCV 2016 Hydra CCNN
        • CNCC2017深度学习与跨媒体智能
        • MLA2016笔记
    • 《机器学习》(周志华)读书笔记
      • 西瓜书概念整理
        • 绪论
        • 模型评估与选择
        • 线性模型
        • 决策树
        • 神经网络
        • 支持向量机
        • 贝叶斯分类器
        • 集成学习
        • 聚类
        • 降维与度量学习
        • 特征选择与稀疏学习
        • 计算学习理论
        • 半监督学习
        • 概率图模型
        • 规则学习
        • 强化学习
        • 附录
  • Java
    • java web
      • Servlet部署
      • 琐碎的tips
    • JNI
    • Note
    • Effective Java笔记
  • 后端开发
    • 架构设计
    • 数据库
    • java web
      • Servlet部署
      • 琐碎的tips
    • Spring boot
    • django
    • 分布式
  • Linux && Hardware
    • Ubuntu安装与初始配置
    • 树莓派相关
      • 树莓派3B+无线网卡监听模式
      • TP-LINK TL-WR703N v1.7 openwrt flashing
  • Python
    • django
    • 原生模块
    • 设计模式
    • 可视化
    • 常用库踩坑指南
  • web前端
    • header div固定,content div填充父容器
    • json接口资源
  • UI
  • kit
    • vim
    • git/github
      • 刷爆github小绿点
    • Markdown/gitbook
      • 琐碎知识点
      • gitbook添加disqus作为评论
      • 导出chrome书签为Markdown
      • Markdown here && 微信公众号
    • LaTex
      • LaTex琐记
    • 科学上网
    • 虚拟机
  • thinking-in-program
    • 怎样打日志
  • 我的收藏
  • 琐记
    • 论文心得
    • 深圳买房攻略
  • 赞赏支持
由 GitBook 提供支持
在本页

这有帮助吗?

  1. Android
  2. activity

多task的应用

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

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),

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

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

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

  • 如果要打开的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可以被复用,节省了创建时的开销。

上一页Intent Flag下一页Task和回退栈

最后更新于6年前

这有帮助吗?