首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Android任务和后台文档中复制示例?

如何在Android任务和后台文档中复制示例?
EN

Stack Overflow用户
提问于 2019-03-20 03:18:52
回答 1查看 39关注 0票数 0

我试图通过阅读正式文档:https://developer.android.com/guide/components/activities/tasks-and-back-stack来理解Android任务和后台堆栈。

我有几个关于文件的问题。

问题1:在图4中,文档中有两个任务--一个前台任务和一个后台任务,后台任务包含活动Y和X,如果活动Y是用singleTask启动模式声明的,那么如何能够在活动X的基础上创建一个具有活动Y的任务?

对于其他问题,我准备了一个简单的项目--2项活动,A和B。在这两项活动中,我都有两个按钮:

  • 按钮A打开活动A
  • 按钮B打开活动B

活动A是主要(发射器)活动。

问题2:文档指出,使用意图标志FLAG_ACTIVITY_NEW_TASK会产生与使用singleTask启动程序模式相同的行为:

这将产生与上一节中讨论的"singleTask“launchMode值相同的行为。

这不是我从测试应用程序中看到的。如果活动B的启动模式设置为singleTask,如果我的后台堆栈是A -> B -> A -> A,那么如果打开B,后端堆栈将看起来像A -> B(它将弹出最后的2 As)。我猜想它背后的原因是创建的任务:当发送启动程序意图时,它在新任务中打开活动A(让我们把它称为任务1),当我打开B时,它在任务2中打开它(因为它有singleTask启动模式),然后是在task 2中打开的2A活动。在再次打开B之后,Android发现了一个已经有B活动的任务(Task 2),它把它带到了最前面,弹出了2 As。

但是,使用FLAG_ACTIVITY_NEW_TASK而不是singleTask并不会产生相同的行为,它只会在其他一切之上打开B。文档是错的,还是我做错了什么?

问题3:最后的例子是:

标记活动的两种启动模式,即"singleTask“和"singleInstance",只有在活动具有ACTION_MAIN和CATEGORY_LAUNCHER筛选器时才能使用。例如,想象一下,如果缺少过滤器,会发生什么情况:一个意图启动一个"singleTask“活动,启动一个新任务,而用户在这个任务上花费一些时间。然后,用户按Home按钮。任务现在被发送到后台,并且不可见。现在,用户无法返回任务,因为它没有在应用程序启动程序中表示。

如何复制?在前面的示例中,我在一个新任务中打开了活动B,但是如果我再次单击home按钮和启动程序图标,我将返回到活动B。因此,即使我使用的是singleTask启动模式,我仍然能够通过使用启动程序图标或从最近的应用程序列表中选择它来返回该任务。

很有可能我在这里做错了什么,并且没有生成新的任务,是否有方法查看特定应用程序的所有任务和活动?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 19:19:10

今天我花了更多的时间来了解这里发生了什么,我想我有答案了。我意识到,在我的例子中,没有什么能产生新的任务。任务在Recent screens (后台的应用程序)中是可见的--至少在Android 5+上是这样。

因此,应该回答的第一个问题是:为什么创建活动B不创建一个新任务?

这是因为生成新任务与taskAffinity属性密切相关。如果不指定此属性,则活动将具有默认的taskAffinity,即应用程序的包名。当您使用singleTask启动程序模式打开活动时,Android将查找具有相同亲和力的任务(任务的亲和力由其根活动亲和力定义),如果找到该任务,它将将您的活动添加到该任务中。因为我没有指定关联,所以android假设我想要将我的活动添加到任务中,这个关联等于应用程序的包,而且它根本没有创建新的任务。它只是在现有的任务中添加了一个活动。

也就是说,FLAG_ACTIVITY_NEW_TASKsingleTask有很大的不同,尽管它们有时会产生相同的行为。如果使用FLAG_ACTIVITY_NEW_TASK标志触发意图,试图打开活动A而不指定活动的taskAffinity,那么通常只需在当前任务的顶部添加一个活动。(这仍然让我感到困惑,我希望只有当活动不在堆栈中时,它才会打开一个活动;如果是的话,它应该什么也不做。)

在没有此标志的情况下打开相同的活动,但使用singleTask模式,将再次不会创建新任务,但将:

  1. 如果活动不在堆栈(这是问题1的答案)中,则将其添加到顶部
  2. 销毁您上面的所有活动,如果活动已经在堆栈中,则调用onNewIntent。(我认为branch.io使用这种方法来处理深度链接-这在我看来确实很麻烦,但是.)

另一方面,如果您为活动指定了taskAffinity,那么:

  • 如果设置了singleTask模式,android将使用此关联搜索任务,如果任务是存在的,则将搜索任务。
代码语言:javascript
运行
复制
1. add your activity on top if the activity is not on task's backstack
2. destroy all activities on top of your activity and call `onNewIntent` if the activity is in the back stack.

如果任务不存在,它将创建一个新的任务,并将您的活动添加为root。

  • 如果在意图中设置了FLAG_ACTIVITY_NEW_TASK标志,android将使用指定的关联搜索任务,如果它找到了任务,它只会将该任务带到前台,而不破坏堆栈或调用。(我测试过,如果活动位于后端堆栈中,我猜如果活动不在后台堆栈中,则会将其推到任务的堆栈中)。

因此,要回答问题2,标志FLAG_ACTIVITY_NEW_TASK和启动模式singleTask是不同的。我想,通过多使用两个标志FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP,可以实现类似的行为。

我认为有关问题3的文档中的示例与Android的旧版本(低于5.0)相关。在Recent Screens中没有显示不同的任务--这是文档:https://developer.android.com/guide/components/activities/recents

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55253074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档