为什么行为不同?- android:launchMode= "singleTask" , android:taskAffinity= " " 和Intent.FLAG_ACTIVITY_NEW_TAS



我有四个活动-a,b,c,d

我以方式称这四个活动 -> a-b-c-d-b。(指定的方式)

我有三种情况。

1st: - 我仅在B活动中定义android:launchMode="singleTask"。我以上指定的方式通过Intent调用所有活动。

现在首先调用A-B-C-D,BackStack Task 1 : A-B-C-D,

现在我再次致电B,然后是BackStack Task 1 : A-B。在这里C和D活动被破坏。

第二: - 我定义android:launchMode="singleTask"&B活动中的android:taskAffinity=""。我以上指定的方式通过Intent来调用所有活动。

现在首先调用A-B-C-D,BackStack Task 1 : A

                                  Task 2 : B-C-D

现在我再次致电B,然后BackStack Task 1 : A

                                Task 2 : B ,Here C and D Activities are destroyed.

3rd: - 我定义Intent.FLAG_ACTIVITY_NEW_TASK&B活动中的android:taskAffinity=""。我以上指定的方式通过Intent调用所有活动。

现在首次调用A-B-C-D,BackStack Task 1 : A

                                  Task 2 : B-C-D

现在我再次致电B,然后BackStack Task 1 : A

                                Task 2 : B-C-D , Here **Can't call B again**

在这里说flag_activitivity_new_task产生的行为与" singletask" - https://developer.android.com/guide/guide/components/components/activities/tasks--backs-and-back-sh--back-stack.htamp.html

那么,哪些是正确的方案?我做对了,否则我正在误解一些东西。

我已经重现了您所描述的行为。

第一种情况基本上是没有证明的,因为singleTask Activity应该始终是任务的根源。因为Android在确定如何和何地启动Activity时使用taskAffinity,所以您的singleTask Activity正在启动到现有任务中,但不作为根Activity。这使得行为与所记录的行为不同。当您从D启动B时,Android需要在onNewIntent()的呼叫中将Intent传递到B,它不能与CD一起坐在B的顶部。因此,Android完成CD,然后在B上调用onNewIntent()

第二种情况表明您现在有2个任务,因为singleTask Activity被启动到一个新任务中,作为ROOT Activity。同样,当D启动B时,Android需要通过调用onNewIntent()来将Intent传递到B,如果CD在路上,它将无法做到。因此,Android完成CD,然后将Intent传递到B中的CC_47。

第三种情况显示了FLAG_ACTIVITY_NEW_TASK的使用。当A使用FLAG_ACTIVITY_NEW_TASK启动B时,Android寻找具有B作为根Activity的现有任务。由于它找不到一个,因此它将在新任务中启动B作为root Activity。当D使用FLAG_ACTIVITY_NEW_TASK启动B时,Android会寻找一个将B作为根Activity的任务,如果找到一个,则将该任务带到前景>但不会将Intent传递给onNewIntent() 。这只是将现有任务带到该州进入背景时所在状态的一种方式。这就是您所看到的。也记录了这种行为(类似),但是由于所有这些情况之间的相互依赖性非常复杂,因此未明确记录所有可能的情况。有时,您需要通过经验观察而不是阅读文档来发现它的工作原理。

感谢您的挑战。

作为上述答案的补充,现在我将Pixel 2与API 29一起使用,场景1和2的结果保持不变,但是在方案3中,B的新实例是B将添加到任务堆栈中,而不仅仅是将任务带到前景。

不幸的是,此行为仍然很悠久。

相关内容

  • 没有找到相关文章

最新更新