Android任务和进程、SingleTask和SingleInstance

2023-11-24

我已经阅读了 Google Android 开发者页面,但是任务的概念(http://developer.android.com/guide/components/tasks-and-back-stack.html)真让我困惑。

当我读到 SingleTask 和 SingleInstance 后,我变得更加困惑。

我想通过例子提出一些问题,希望我能从这些问题中有更好的理解:

假设我有 2 个应用程序 A 和 B,A 有 x、y、z 活动; B 有 1、2、3 项活动:

假设它们的启动模式是标准(不使用任何意图标志)。 x 是应用程序 A 的 Main Activity; 1 是应用程序 B 的主要 Activity。

1)启动应用程序A,然后x-> y -> 1,按home按钮,再次启动应用程序A,我们将看到活动y或1?

2)启动应用程序A,然后x -> 1 -> y -> 2 -> z -> 3,按home按钮,启动应用程序A,它将包含所有活动(x -> 1 -> y -> 2 -> z -> 3),或者仅包含 x -> y -> z?如果我们现在启动应用程序 B 怎么样?应用程序 B 将包含哪些活动?

现在假设活动 1、2、3 是 SingleTask; x,y,z 仍为标准:

3)启动应用程序A,然后x -> y -> 1 -> 2,按home按钮,启动应用程序A,它将仅包含x -> y还是包含x -> y -> 1 -> 2?如果我们现在启动应用程序 B 怎么样?应用程序 B 将仅包含 1 还是 1 -> 2?

4)启动应用B,然后1 -> 2 -> 3 -> 1,2和3会被销毁吗?

5) 启动应用程序 B,然后 1 -> 2 -> 3,按 home 按钮,立即启动应用程序 A,然后 x -> y -> 2,然后按返回按钮放下 2. 现在启动应用程序 B,它包含哪些活动?仅 1 -> 3 还是 1 -> 2 -> 3?

感谢任何人的回复和帮助!


假设他们的启动模式是标准的(不使用任何意图 旗帜)。 x 是应用程序 A 的 Main Activity; 1 是应用程序 B 的主要 Activity。

1)启动应用程序A,然后x-> y -> 1,按home按钮,启动应用程序A 再次,我们将看到活动 y 或 1?

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

2)启动应用程序A,然后x -> 1 -> y -> 2 -> z -> 3,按home按钮, 启动应用程序 A,它将包含所有活动 (x -> 1 -> y -> 2 -> z -> 3),或者仅包含 x -> y -> z?

如上所述,您有一个任务。当您按 HOME 时,任务包含x->1->y->2->z->3并移至后台。当您再次启动应用程序 A 时,任务将被提前(完整),您将看到活动3 on top.

如果我们启动应用程序 B 怎么样? 现在?应用程序 B 将包含哪些活动?

嗯,这样的问题是不正确的。你真正想知道的是“这会发生什么活动?task包含?”,但答案是:

如果从主屏幕启动应用程序 B,您将开始一个新任务。该任务将包含一个活动,即1。此任务与其他任务(仍在后台)无关。后台任务包含来自 2 个不同应用程序的活动这一事实是无关紧要的。

现在假设活动 1、2、3 是 SingleTask; x,y,z 仍为标准:

3)启动应用程序A,然后x -> y -> 1 -> 2,按home按钮,启动应用程序 A,它将仅包含 x -> y 还是包含 x -> y -> 1 -> 2?

在活动点y发起活动1,这将创建一个新任务。所以你将有一个包含活动的任务x->y和第二个任务包含1。活动时1发起活动2发生的情况不仅仅取决于launchMode的活动。即使活动2被宣布launchMode="singleTask",如果taskAffinity活动的2taskAffinity活动的1(默认情况下,如果它们属于同一个应用程序,则活动)2将在与活动相同的任务中创建1(即:它的行为就像活动一样2 had launchMode="standard")。然而,如果活动1和活动2有不同的taskAffinity,然后活动2将作为新任务中的根活动启动。现在您将有 3 个任务,如下所示: Task1 包含x->y,任务2包含1任务 3 包含2.

如果我们现在启动应用程序 B 怎么样?应用程序 B 将仅包含 1 还是 1 -> 2?

如上所述,这取决于taskAffinity。如果taskAffinity活动的1 and 2是相同的,从主屏幕启动应用程序 B 将带来包含以下内容的任务1->2到前台。如果taskAffinity活动的不同,从主屏幕启动应用程序 B 将带来包含活动的任务1到前台。

4)启动应用B,然后1 -> 2 -> 3 -> 1,2和3会被销毁吗?

No. 2 and 3不会被破坏。 假如说1, 2 and 3都有launchMode="singleTask"那么它(再次)取决于taskAffinity设置。假设所有活动都有相同的taskAffinity,那么你将有一个任务包含1->2->3->1(您将有 2 个活动实例1) 因为taskAffinity trumps launchMode.

如果所有活动都有不同taskAffinity, 然后1->2->3您将有 3 个独立的任务,每个任务包含一个活动。然后,当活动3开始活动1,这只会带来包含活动的任务1到前台和不会创建新的 Activity 实例1.

5) 启动应用程序B,然后1 -> 2 -> 3,按home按钮,启动应用程序A 现在,然后 x -> y -> 2 然后按后退按钮放下 2。启动应用程序 B 现在,它包含哪些活动?仅 1 -> 3 还是 1 -> 2 -> 3?

再次强调,这取决于taskAffinity。如果应用程序 B 的所有 Activity 都具有相同的taskAffinity然后1->2->3你将有一项任务。用户按下 HOME 按钮此任务将转到后台。现在用户启动应用程序 A 创建一个新任务。后x->y第二个任务包含这两项活动。现在活动y开始活动2。由于本次活动已launchMode="singleTask"并且有不同的taskAffinity来自任务中的其他活动(它们都有taskAffinityApp A), Android 将创建一个带有 Activity 的新任务2作为根。 Android 无法使用包含以下内容的现有任务1->2->3因为该任务不包含活动2作为它的根。当用户按 BACK 时2,这将完成活动2这将完成第三个任务,将用户返回到第二个任务,其中包含x->y有活动y在上面。现在按 HOME 并启动应用程序 B 将带来现有的第一个任务,其中包含1->2->3到前台。

但是,如果应用程序 B 的所有 Activity 都有不同的taskAffinity, 然后1->2->3您将有 3 个独立的任务,每个任务包含一个活动。用户按 HOME 并启动应用程序 A 创建一个新任务(现在您有 4 个任务)。后x->y第四个任务包含这两项活动。现在活动y开始活动2。 Android只是带来包含activity的任务2到前台。用户按下“后退”按钮,这完成了活动2以及它所在的任务(因为该任务现在是空的),将用户返回到上一个任务,该任务包含x->y从应用程序 A。从主屏幕启动应用程序 B 只会带来包含活动的任务1到前台。您现在有 3 个任务: Task1 包含活动1并且位于前台,Task2 包含活动3并且在后台,Task3 包含x->y并且在后台。

NOTES

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

如果你使用singleInstance or singleTask你需要知道如何taskAffinity有效,您还需要确保声明为“singleTask”或“singleInstance”的每个活动都有不同的应用程序图标(可能还有应用程序标签)。否则,由于最近任务列表中的显示方式,用户将无法返回到正确的任务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android任务和进程、SingleTask和SingleInstance 的相关文章

  • Android 中读取未提交的事务

    我正在进行大量数据库操作 这会向我的数据库添加大约 10 000 条记录 由于这可能需要很长时间 因此最好使用事务 db startTransaction do write operations db setTransactionSucce
  • 如何在状态更改时更改 Android 切换按钮的文本颜色?

    我的切换按钮对于每个状态都有不同的颜色背景 红色和白色 现在我需要在激活时更改切换按钮文本 红色 白色 的颜色 使用 xml 我无法让它工作 也许有人知道我做错了什么 我的布局 xml 中的按钮
  • com.google.android:android:jar 的 dependency.dependency.version' 丢失

    我正在尝试使用 Eclipse 运行一个简单的虚拟 Android 项目 并且我正在尝试使用 Maven amd 我已按照已接受答案的教程进行操作this https stackoverflow com questions 6735562
  • 如何在Android中将文件转换为base64(如.pdf、.text)?

    如何将 SD 卡文档 pdf txt 转换为 Base 64 字符串并将字符串发送到服务器 这个方法对我有用 String encodeFileToBase64Binary encodeFileToBase64Binary yourFile
  • 在我授予许可后,表面视图不显示相机

    public View onCreateView LayoutInflater inflater Nullable ViewGroup container Bundle savedInstanceState View view inflat
  • 如何使用 Retrofit 2 和 RxJava 处理分页

    我知道如何处理 Retrofit 响应 但在使用 rx java 处理来自 REST API 的分页时遇到问题 背景 我使用的其余 api 为我提供了以下响应 并在标题中提供了下一页的链接 HTTP 200 OK Allow GET HEA
  • 针对 Android 开发优化 Eclipse

    我使用 Eclipse 和 ADT 插件开发 Android 而且速度 很慢 我必须经常重新启动 当我打开各种 Android 项目 当我使用库项目时需要 时 情况会变得更糟 使用 ADT 插件时 是否可以进行任何具体优化来提高 Eclip
  • 无法从视图转换为按钮

    我在这里遇到非常令人沮丧的问题 我有这个代码 Button b findViewById android R id button1 我收到了这个错误 类型不匹配 无法将表单视图转换为按钮 但是按钮1is一个按钮 在我的 XML 布局文档中
  • Android EditText默认数字键盘和允许文本[重复]

    这个问题在这里已经有答案了 可能的重复 EditText 默认带有数字键盘 但允许字母字符 https stackoverflow com questions 3544214 edittext with number keypad by d
  • Android 上 WebRTC 的自定义视频源

    Overview 我想使用自定义视频源通过 WebRTC Android 实现来直播视频 如果我理解正确的话 现有的实现仅支持 Android 手机上的前置和后置摄像头 以下类与此场景相关 Camera1Enumerator java ht
  • 如何在谷歌地图上显示闪烁的图标

    我想在谷歌地图上显示用户的当前位置 每件事对我来说都运转良好 我只是使用标记在地图上显示当前位置 现在我想让该标记像 Android 手机上的原始谷歌地图应用程序一样闪烁 我想我必须使用动画来达到这个目的 但我不知道如何使用它 我正在互联网
  • Android 原生 AAssetManager 的文件层次结构

    Issue 我想知道如何从本机代码创建 Android 中资产文件夹的文件层次结构 我在用着AAssetManager openDir but AAssetDir getNextFileName不返回任何目录名称 因此基本上我无法深入了解层
  • 如何以编程方式设置 ConstraintLayout 的 XML 属性“layout_constrainedWidth”?

    ConstraintLayout中 如何转换xml属性 app layout constrainedWidth true false in code 如果你想设置constrainedWidth Height以编程方式 那么你必须采取Con
  • Android中从一个应用程序向另一个应用程序发送数据时的加密

    我想将敏感数据从一个应用程序发送到另一个应用程序 我使用 Intent 并通过 Bundle 发送数据 现在 我应该使用加密算法来加密要发送的数据 同时接收器应用程序将解密数据 哪种算法最适合移动平台 我浏览过RSA文档 建议不建议用于长文
  • 如果从超链接打开,应用程序将启动两次

    我正在开发一个应用程序 可以从多个地方启动 例如日历中的超链接 我在以下场景中面临问题 如果应用程序已启动并在后台运行 并且用户单击本机日历中的事件 超链接来启动应用程序 我的应用程序作为新实例启动两次 在正在运行的应用程序列表中 我可以看
  • 抽屉式导航不显示片段

    我创建了一个新的 Android Studio 项目 我的 MainActivity 是导航抽屉活动 所以 我无法显示碎片 我在互联网上和这里读过很多帖子 解释 我打开导航抽屉 选择菜单 播客 PodcastsFragment 应该显示 但
  • Textview 第一次点击时为空,但第二次点击时更新

    它是使用兼容性包的小型 Android 2 2 测试应用程序 我正在尝试更新列表项选择上另一个活动的另一个片段上的文本视图 但问题是 每次第一次单击都会返回空指针异常 并且只有在第二次尝试时 其文本才会更改 我想知道为什么会发生这种情况以及
  • 应用程序启动器图标显示在活动的操作栏上

    在我的操作栏上显示应用程序图标 我不希望它出现在操作栏上 我修改了 androidmanifest xml 并删除了android icon从活动元素中 即使图标正在显示
  • 如何在运行时检查授予权限?

    In Android M 预览版 用户可以选择特定的应用程序并检索特定的权限 所以我问如何在运行时检查授予权限 您可以使用以下复制的代码https android googlesource com platform frameworks b
  • 切换按钮形状不变

    我正在尝试制作一个带有绿色背景的圆形切换按钮 我用了

随机推荐

  • 如何在 Swift 框架中使用 Cocoapods?

    我正在尝试使用 Cocoapods 中的一些库在 Swift 中为 iOS 创建一个新的 Cocoa Touch 框架 但我无法让它工作 我知道有一些关于此的悬而未决的问题 但它们似乎都不能解决我的问题 出于测试目的 我刚刚创建了一个空的
  • 用python求解非线性方程组

    我可以用Python中的参数求解非线性方程组吗 有示例或教程吗 我可以在 Maple 中轻松完成此操作 但我的特定系统的表达式非常大 复制它们非常困难 例子 sigma y x 0 x rho z y 0 x y beta z 0 您应该得
  • 替换模式内所有出现的地方

    我有一个像这样的字符串 some text other text and some other text this should not be replaced but this should 我希望它成为 some text other
  • 使用 Electron 嵌入 Mongodb

    我将 MongoDB 源代码保存在电子源代码中 并使用以下命令运行 MongoDB const app require electron app const child process require child process const
  • Rails:使用回形针防止重复照片上传?

    如果用户尝试使用 Paperclip 将同一张照片上传到 Rails 应用程序两次 是否会引发验证错误 Paperclip 似乎没有提供此功能 我正在使用 Rails 2 3 5 和回形针 明显地 解决方案 或至少其中之一 根据 Beerl
  • 创建一个只有一个对角线的 UIView

    我需要创建一个左边框倾斜的 UIView45度我想知道 有没有办法以编程方式实现这一目标 做CA变换3D在这种情况下帮助我 因为它不是真正的 3D 旋转 Edit 这是一张图片 更多地解释了我所需的输出 如果您只想要没有内容的形状 那么您可
  • gmpxx.h:没有这样的文件或目录

    我刚刚安装了一个全新的 mingw 32 位 下载它来自官方项目页面来自 Sourceforge 我安装了包中的所有内容 所有编译器等等 然后我从下载hereMinGW 的 gmp 我将 gmp 5 0 1 1 mingw32 src ta
  • 显示用户窗体后将焦点设置回应用程序窗口

    当显示用户表单时 运行其Show方法 它不仅显示在屏幕上 而且还获取焦点 例如击键的目的地 比如说 用户窗体是一个定制的工具栏 它是Show开火Workbook Open 但表单本身的使用相对较少 因此我们希望焦点在其出现后立即返回到主应用
  • WPF 元素事件处理程序中的 UI 更新

    WPF 中的 UI 更新存在问题 我有这样的代码 private void ButtonClick EventHandler object sender RoutedEventArgs e Label Visibility Visibili
  • Grails / Groovy - 域对象 - 其属性映射

    如何获取我的域对象之一上仅用户定义属性的键 值的映射 问题是 如果我自己这样做 我会得到我的属性加上类 元类 约束 闭包等 我认为 Grails 可以相当容易地做到这一点 因为它是在脚手架代码中的某个级别完成的 对吗 我自己怎样才能做到这一
  • 循环 PHP 嵌套数组 - 将值提取到刀片视图中 (Laravel)

    我知道关于这个主题有很多问题 但没有一个完全解决这个问题 据我所知 我在 Laravel 项目中有一个 PHP 数组 仅供参考 是通过 Guzzle 响应返回的 PHP 数组 users array 2 error gt bool fals
  • ApplicationException 或创建自定义异常?

    在我的文件存储库中 当InsertFile 方法称为 当上传文件大小超过限制时 当超出存储容量时 目前我只是抛出一个ApplicationException与相关消息 public void InsertFile HttpPostedFil
  • 尽管已设置操作,但单击分段时仍显示 NSSegmentedControl 菜单

    我的 UI 上有一个带有 4 个按钮的 NSSegmentedControl 该控件连接到一个方法 该方法将根据单击的段调用不同的方法 IBAction performActionFromClick id sender NSInteger
  • 使用 AsyncTask 下载文件

    我正在尝试使用 asyncTask 下载文件 但无法正常工作 没有错误消息或什么也没有 只是不要下载文件 我尝试了所有方法 但似乎暂时没有输入 任何人都知道可以做什么是问题所在吗 我在手机上测试过 网址也可以 class DownloadF
  • 在 Matlab 中禁用绘图

    我有一些用 Matlab 编写的程序 由于某些原因我需要运行几次 调试 使用不同的输入进行测试等 但是 程序及其各种功能绘制了很多图表 因此每次运行程序时 我都必须等待所有图表显示出来 这是非常烦人且耗时的 尤其是当您使用小型笔记本电脑 程
  • ag-grid 在单元格渲染器之上渲染

    我已经尝试了我所知道的一切 让我的自定义下拉单元格渲染器显示为 agGrid 示例中最上面的 div 我玩过 z index 定位等 但没有运气 唯一做的事情就是转到其中一个有问题的行并取消选择该行的转换 但随后该行就消失了 欢迎任何想法
  • SVG 九切片缩放

    怎样才能获得九片缩放在 SVG 中 具体来说 我正在寻找一种方法来定义 SVG 对象 使其在调整大小时表现得像九切片对象 某些元素保持其尺寸 而其他元素随容器缩放 如果您打算将其应用于 svg 那么CSS3 边框和背景如果您引用 svg s
  • C# - 将文本文件加载为类

    有没有办法将 txt 文件作为类加载 然后我的主程序可以从中调用函数 我基本上试图向我的简单应用程序添加 mod 支持 用户可以从每个文件中选择选项 该文件遵循类似 但不相同 的格式 带有一堆在主程序中调用的空位 函数 我怎样才能做到这一点
  • Keras 用于多任务学习神经网络的顺序 API 与函数式 API

    我想为多任务深度学习任务设计一个神经网络 在 Keras API 中 我们可以使用 顺序 或 函数 方法来构建这样的神经网络 下面我提供了用于构建网络的代码 使用两种方法构建具有两个输出的网络 顺序 seq model Sequential
  • Android任务和进程、SingleTask和SingleInstance

    我已经阅读了 Google Android 开发者页面 但是任务的概念 http developer android com guide components tasks and back stack html 真让我困惑 当我读到 Sin