我试图通过阅读正式文档:https://developer.android.com/guide/components/activities/tasks-and-back-stack来理解Android任务和后台堆栈。
我有几个关于文件的问题。
问题1:在图4中,文档中有两个任务--一个前台任务和一个后台任务,后台任务包含活动Y和X,如果活动Y是用singleTask
启动模式声明的,那么如何能够在活动X的基础上创建一个具有活动Y的任务?
对于其他问题,我准备了一个简单的项目--2项活动,A和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
启动模式,我仍然能够通过使用启动程序图标或从最近的应用程序列表中选择它来返回该任务。
很有可能我在这里做错了什么,并且没有生成新的任务,是否有方法查看特定应用程序的所有任务和活动?
谢谢。
发布于 2019-03-20 19:19:10
今天我花了更多的时间来了解这里发生了什么,我想我有答案了。我意识到,在我的例子中,没有什么能产生新的任务。任务在Recent screens
(后台的应用程序)中是可见的--至少在Android 5+上是这样。
因此,应该回答的第一个问题是:为什么创建活动B不创建一个新任务?
这是因为生成新任务与taskAffinity
属性密切相关。如果不指定此属性,则活动将具有默认的taskAffinity
,即应用程序的包名。当您使用singleTask
启动程序模式打开活动时,Android将查找具有相同亲和力的任务(任务的亲和力由其根活动亲和力定义),如果找到该任务,它将将您的活动添加到该任务中。因为我没有指定关联,所以android假设我想要将我的活动添加到任务中,这个关联等于应用程序的包,而且它根本没有创建新的任务。它只是在现有的任务中添加了一个活动。
也就是说,FLAG_ACTIVITY_NEW_TASK
和singleTask
有很大的不同,尽管它们有时会产生相同的行为。如果使用FLAG_ACTIVITY_NEW_TASK
标志触发意图,试图打开活动A
而不指定活动的taskAffinity
,那么通常只需在当前任务的顶部添加一个活动。(这仍然让我感到困惑,我希望只有当活动不在堆栈中时,它才会打开一个活动;如果是的话,它应该什么也不做。)
在没有此标志的情况下打开相同的活动,但使用singleTask
模式,将再次不会创建新任务,但将:
onNewIntent
。(我认为branch.io使用这种方法来处理深度链接-这在我看来确实很麻烦,但是.)另一方面,如果您为活动指定了taskAffinity
,那么:
singleTask
模式,android将使用此关联搜索任务,如果任务是存在的,则将搜索任务。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_TOP
和FLAG_ACTIVITY_SINGLE_TOP
,可以实现类似的行为。
我认为有关问题3的文档中的示例与Android的旧版本(低于5.0)相关。在Recent Screens
中没有显示不同的任务--这是文档:https://developer.android.com/guide/components/activities/recents。
https://stackoverflow.com/questions/55253074
复制相似问题