我有四个活动-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
,它不能与C
和D
一起坐在B
的顶部。因此,Android完成C
和D
,然后在B
上调用onNewIntent()
。
第二种情况表明您现在有2个任务,因为singleTask
Activity
被启动到一个新任务中,作为ROOT Activity
。同样,当D
启动B
时,Android需要通过调用onNewIntent()
来将Intent
传递到B
,如果C
和D
在路上,它将无法做到。因此,Android完成C
和D
,然后将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将添加到任务堆栈中,而不仅仅是将任务带到前景。
不幸的是,此行为仍然很悠久。