我有一个在意图数据中包含特定ID的ActivityA,一个从该ActivityA打开的ActivityB,并且ActivityB还可以使用相同或不同的ID打开相同的ActivityA。看到以这种方式打开活动会导致堆栈中的无限活动,我需要通过以下方式管理堆栈:
ActivityA(id: 1) → ActivityB
ActivityA(id: 1)
。请注意,ActivityB 只是
从堆栈中弹出。我知道我可以简单地使用
android:launchMode="singleTask"
来实现此行为。但我的问题是当用户使用不同的 ID 打开 ActivityA 时。所以这是所需的第二个行为:
ActivityA(id: 1) → ActivityB
ActivityA(id: 1) → ActivityB → ActivityA(id: 2)
。请注意,它不是弹出 ActivityB,而是保留在堆栈中并添加 ActivityA 的另一个实例,但现在具有不同的 ID。给定这两种情况,我想要两种不同的行为,具体取决于 ActivityA 的 ID。我的一个限制是我无法控制 ActivityB,因此我无法在 ActivityB 中进行任何更改。
PS:ActivityB 通过 Deeplink 打开 ActivityA。
我可以使用
实现类似的行为android:documentLaunchMode="intoExisting"
android:launchMode="singleTask"
但是每次 ActivityA 打开时它都会创建一个新任务,这将是一个糟糕的用户体验。
使用
taskAffinity
也会创建一个新任务,但我负担不起。
你也许可以像这样完成你想要的事情:
当
ActivityA
启动时,在其 onCreate()
中,它可以将 ID 存储到 static
变量中,该变量可用于 ActivityA
的所有实例(在 Kotlin 中,您可以使用 companion object
中的属性)
当
ActivityB
启动 ActivityA
时,它将始终 创建 ActivityA
的新实例。
当
ActivityA
启动时,它在 onCreate()
中做的第一件事(调用 super.onCreate()
后是检查启动时使用的 id
是否与存储在 id
变量中的 static
相同)如果是,它应该从堆栈中删除 ActivityA
原始实例(包括其自身)之上的所有活动,如下所示:
Intent intent = new Intent(this, ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP |
Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
startActivity(intent);
finish();
尝试一下,看看它是否适合您。
注意:如果首先以 id=5 启动 ActivityA
,然后启动
ActivityB
,然后以 id=3 启动 ActivityA
,然后再启动 ActivityB
,我不知道 应该发生什么,然后启动
ActivityA
。这是真实场景吗?在这种情况下,如果 ActivityB
启动 id = 3 的 ActivityA
会发生什么?在这种情况下,如果 ActivityB
启动 id = 5 的 ActivityA
会发生什么?