如何根据动态ID管理Android中的Activity堆栈行为?

问题描述 投票:0回答:1

我有一个在意图数据中包含特定ID的ActivityA,一个从该ActivityA打开的ActivityB,并且ActivityB还可以使用相同或不同的ID打开相同的ActivityA。看到以这种方式打开活动会导致堆栈中的无限活动,我需要通过以下方式管理堆栈:

  1. 用户打开 ID 为 1 的 ActivityA,然后从那里打开 ActivityB。所以 到目前为止,堆栈将是这样的:
    ActivityA(id: 1) → ActivityB
  2. 然后,用户从 ActivityB 打开 ID 为 1 的同一个 ActivityA,并且 堆栈将类似于:
    ActivityA(id: 1)
    。请注意,ActivityB 只是 从堆栈中弹出。

我知道我可以简单地使用

android:launchMode="singleTask"
来实现此行为。但我的问题是当用户使用不同的 ID 打开 ActivityA 时。所以这是所需的第二个行为:

  1. 用户打开 ID 为 1 的 ActivityA,然后从那里打开 ActivityB。堆栈现在将类似于:
    ActivityA(id: 1) → ActivityB
  2. 现在,用户从 ActivityB 打开 ID 为 2 的 ActivityA, 堆栈应该是这样的:
    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
也会创建一个新任务,但我负担不起。

android android-activity stack singletask singletop
1个回答
0
投票

你也许可以像这样完成你想要的事情:

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
会发生什么?

© www.soinside.com 2019 - 2024. All rights reserved.