Assume that their launch mode are Standard (Not using any intent

flag). And x is Main Activity of app A; 1 is Main Activity of app B.

1) Launch app A, then x-> y -> 1, press home button, launch app A

again, we will see activity y or 1?

您将看到活动1.您有一个任务包含x-> y-> 1,活动1位于该任务的活动堆栈顶部.按HOME时,此任务将移至后台.当您再次启动应用程序时,Android会找到任务堆栈并将其(完整)带回前台,向您显示堆栈中的顶级活动(在本例中为1).

2) Launch app A then x -> 1 -> y -> 2 -> z -> 3, press home button,

launch app A, it will contain all the activities (x -> 1 -> y -> 2 ->

z -> 3), or it contains x -> y -> z only?

如上所述,您只有一个任务.当您按HOME时,任务包含x-> 1-> y-> 2-> z-> 3并移动到后台.当您再次启动App A时,任务将被提前(完整),您将在顶部看到活动3.

How about if we launch app B

now? What activities will app B contain?

那么,这样的问题是不正确的.你真正想知道的是“这项任务包含哪些活动?”,但这里是答案:

如果从HOME屏幕启动App B,则将启动新任务.此任务将包含单个活动,即1.此任务与其他任务(仍在后台)无关.后台任务包含来自2个不同应用程序的活动这一事实无关紧要.

Now let’s say activities 1, 2, 3 are SingleTask; x,y,z still Standard:

3) Launch app A, then x -> y -> 1 -> 2, press home button, launch app

A, it will contain x -> y only or it contains x -> y -> 1 -> 2?

在活动y启动活动1时,这将创建一个新任务.因此,您将拥有一个包含活动x-> y的任务和一个包含1的第二个任务.当活动1启动活动2时,所发生的事情不仅仅取决于活动的launchMode.即使活动2被声明为launchMode =“singleTask”,如果活动2的taskAffinity与活动1的taskAffinity相同(默认情况下,如果它们属于同一个应用程序),则将创建活动2在与活动1相同的任务中(即:它的行为就像活动2具有launchMode =“standard”).但是,如果活动1和活动2具有不同的taskAffinity,则活动2将作为新任务中的根活动启动.现在你将有3个任务,如下所示:Task1包含x-> y,Task2包含1,Task3包含2.

How about if we launch app B now? app B will contain 1 only or 1 -> 2?

如上所述,这取决于taskAffinity.如果活动1和2的taskAffinity相同,则从HOME屏幕启动应用程序B将使包含1-> 2的任务进入前台.如果活动的taskAffinity不同,则从HOME屏幕启动应用程序B会将包含活动1的任务带到前台.

4) Launch app B, then 1 -> 2 -> 3 -> 1, will 2 and 3 be destroyed?

2号和3号不会被销毁.

假设1,2和3都具有launchMode =“singleTask”,那么它(再次)取决于taskAffinity设置.假设所有活动都具有相同的taskAffinity,那么您将拥有一个包含1-> 2-> 3-> 1的任务(您将拥有2个活动1的实例),因为taskAffinity胜过launchMode.

如果所有活动都有不同的taskAffinity,那么在1> 2-> 3之后,您将拥有3个单独的任务,每个任务包含一个活动.然后,当活动3开始活动1时,这只会将包含活动1的任务带到前台,并且不会创建活动1的新实例.

5) Launch app B, then 1 -> 2 -> 3, press home button, launch app A

now, then x -> y -> 2 then press back button to drop 2. Launch app B

now, what activities it contains? 1 -> 3 only or 1 -> 2 -> 3?

同样,这取决于taskAffinity.如果应用B的所有活动具有相同的taskAffinity,则在1-> 2-> 3之后,您将拥有一项任务.用户按下HOME按钮,此任务将转到后台.现在,用户启动应用A创建新任务.在x-> y之后,第二个任务包含这两个活动.现在活动y开始活动2.由于此活动具有launchMode =“singleTask”并且与任务中的其他活动具有不同的taskAffinity(它们都具有App A的taskAffinity),Android将创建一个以活动2为根的新任务. Android无法使用包含1-> 2-> 3的现有任务,因为该任务不包含活动2作为其根.当用户按下2中的BACK时,这将完成活动2,该活动将完成第三个任务,将用户返回到包含x-> y且活动y在顶部的第二个任务.现在按下HOME并启动应用程序B将把包含1-> 2-> 3的现有第一个任务带到前台.

但是,如果应用B的所有活动都具有不同的taskAffinity,那么在1> 2-> 3之后,您将有3个单独的任务,每个任务包含一个活动.用户按下HOME并启动App A创建新任务(现在您有4个任务).在x-> y之后,第四个任务包含这两个活动.现在,活动y开始活动2. Android只是将包含活动2的任务带到前台.用户按下BACK按钮,完成活动2及其所在的任务(因为该任务现在为空),将用户返回到上一个任务,该任务包含来自应用程序A的x-> y从中启动应用程序B. HOME屏幕将简单地将包含活动1的任务带到前台.您现在有3个任务:Task1包含活动1并且在前台,Task2包含活动3并且在后台,Task3包含x-> y并且在后台.

笔记

我意识到这很复杂.我的回答是从我的头脑,我没有尝试实际实现所有这些组合和检查(但是,我过去已经实现了许多这些案例,我确实知道它是如何工作的).原因是你描述的大部分内容都不会在现实世界中完成,因此这些例子只是理论上的而不实际的.在现实生活中,您几乎不需要使用singleTask或singleInstance启动模式,除非您正在构建自己的HOME屏幕替换,或者您需要仔细控制应用程序在其他应用程序启动时的行为方式.在大多数情况下,您将永远不会有多个具有singleTask或singleInstance启动模式的活动.

如果您使用singleInstance或singleTask,则需要了解taskAffinity的工作原理,并且还需要确保为每个声明为“singleTask”或“singleInstance”的活动设置不同的应用程序图标(可能还有app标签) .如果不是,由于最近任务列表中显示的方式,用户将无法返回正确的任务.

android 任务和进程,Android任务和进程,SingleTask和SingleInstance相关推荐

  1. Android应用中通过AIDL机制实现进程间的通讯实例

    Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达 ...

  2. Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)

    本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...

  3. Android 10.0 系统启动之SystemServer进程-[Android取经之路]

    摘要:上一节讲解了Zygote进程的整个启动流程.Zygote是所有应用的鼻祖.SystemServer和其他所有Dalivik虚拟机进程都是由Zygote fork而来.Zygote fork的第一 ...

  4. Android 10.0系统启动之init进程-[Android取经之路]

    摘要:init进程是linux系统中用户空间的第一个进程,进程号为1.当bootloader启动后,启动kernel,kernel启动完后,在用户空间启动init进程,再通过init进程,来读取ini ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 调试进程 ATTACH 附着目标进程 | 读取目标函数寄存器值并存档 )

    文章目录 一.调试进程 ATTACH 附着目标进程 二.读取目标函数寄存器值并存档 1.主要操作流程 2.ptrace 函数 PTRACE_GETREGS 读取寄存器值 一.调试进程 ATTACH 附 ...

  6. 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

    文章目录 一.进程注入原理 二.远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 ) 一.进程注入原理 调试进程 At ...

  7. 【Android 应用开发】Android 杀进程总结 ( 杀后台进程 | 杀前台进程 | 杀其它进程 )

    文章目录 一.Android 杀后台进程 二.Android 杀前台进程 三.Android 杀其它进程 一.Android 杀后台进程 使用 Android 的进程 api 类 android.os ...

  8. 【Android 进程保活】Android 进程优先级 ( 前台进程 | 可见进程 | 服务进程 | 后台进程 | 空进程 )

    文章目录 一.Android 进程优先级 二.前台进程 三.可见进程 四.服务进程 五.后台进程 六.空进程 一.Android 进程优先级 Android 进程优先级 : ① 前台进程 > ② ...

  9. Android系统开机启动流程及init进程浅析

    Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动 Linux内核启动 Android系统启动,Launcher/app ...

  10. android remoteviews 设置背景,Android通过RemoteViews实现跨进程更新UI示例

    一.概述 前面一篇文章Android通过AIDL实现跨进程更新UI我们学习了aidl跨进程更新ui,这种传统方式实现跨进程更新UI是可行的,但有以下弊端: View中的方法数比较多,在IPC中需要增加 ...

最新文章

  1. 前沿技术探秘:知识图谱构建流程及方法
  2. [ACM] hdu 1671 Phone List (字典树)
  3. python3 串行并列实际应用
  4. 一天一个Linux基础命令之复制文件或目录命令cp
  5. [css] 对比下px、em、rem有什么不同?
  6. KlayGE C++代码风格指南英文版
  7. Android 打造完美的侧滑菜单/侧滑View控件
  8. BSN: Boundary-Sensitive Network for Temporal Action Proposal Generation
  9. 麦克纳姆轮全向移动机器人斜向直线运动分析
  10. nodejs 图片处理模块 rotate_会照片处理的不只是ps,还有python!
  11. arm2410 linux,ARM2410与Linux开发环境的搭建
  12. 霍夫变换(Hough Transformation)基本思想及MATLAB相关函数
  13. Google的快照的用户体验感觉不如之前
  14. .net web页面嵌入海康视频(winform)
  15. 百度色情图片识别API
  16. MATLAB如何创建表格
  17. mysql 错误 1548_mysql报错1548-Cannot load from mysql.proc. The table is probably corrupted
  18. Python中json.loads()无法解析单引号字符串问题的两种解决方法
  19. python安装百度aip_Python人工智能-基于百度AI接口
  20. linux 串口发送 内核,使用串口线真机调试Linux内核

热门文章

  1. 用友U9 SOA Ready (转载)
  2. Python 的版本与虚拟环境管理
  3. 解析纯真ip数据库php源码, 纯真数据库IP地理位置查询类
  4. 关于悟空CRM部署经历--钟艳明
  5. [游戏开发]网络同步方式
  6. windows.h 详解
  7. dosbox运行C语言,DosBox的基本设置和安装
  8. java监控屏幕_Java实现简单屏幕监控
  9. data fastboot 擦除_安卓刷机 - Fastboot命令
  10. 分销商城平台开发现成源码