为什么行为不同? - android:launchMode =“singleTask”,android:taskAffinity =“”和Intent.FLAG_ACTIVITY_NEW_TASK

时间:2017-09-26 13:23:58

标签: android back-stack launchmode

我有四项活动 - A,B,C,D

我以这种方式称呼这四项活动 - > A-B-C-d-B。 (指定方式)

我有三种情况。

第一名: - 我只在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.

第3名: - 我正在定义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_ACTIVITY_NEW_TASK产生与“singleTask”相同的行为 - https://developer.android.com/guide/components/activities/tasks-and-back-stack.html

那么哪种情况正确?我做对了,或者我误解了什么。

1 个答案:

答案 0 :(得分:4)

我已经按照你所描述的那样重现了这种行为。

第一个场景基本上没有记录,因为singleTask Activity应始终是任务的根。由于Android在确定taskAffinity的启动方式和位置时使用Activity,因此您的singleTask Activity将被启动到现有任务中,但不会作为根Activity启动}。这使得行为与记录的行为不同。当您从B启动D时,Android需要在Intent的调用中将B传递给onNewIntent(),这与C无关}和D位于B之上。因此Android完成CD,然后在onNewIntent()上调用B

第二个方案显示您现在有2个任务,因为singleTask Activity作为根Activity启动到新任务中。同样,当D启动B时,Android需要通过调用IntentB发送到onNewIntent(),如果C,则无法执行此操作D挡路了。因此,Android完成CD,然后将Intent传递到B中的onNewIntent()

第三种情况显示FLAG_ACTIVITY_NEW_TASK的使用。当A使用B启动FLAG_ACTIVITY_NEW_TASK时,Android会查找以B为根Activity的现有任务。由于它没有找到,因此它会在新任务中以B启动Activity。当D使用B启动FLAG_ACTIVITY_NEW_TASK时,Android会查找以B为根Activity的任务,如果找到一个,则会带来该任务到前景但未将Intent传递给onNewIntent() 。这只是一种将现有任务置于其前进到后台状态的前台的方法。这就是你所看到的。此行为也被记录(排序),但由于所有这些方案之间的相互依赖性非常复杂,因此未明确记录所有可能的情况。有时你需要通过经验观察而不是阅读文档来发现它是如何工作的。

感谢您的挑战。