在某个片段中启动一个 Activity,然后从它启动的地方返回到之前的 Activity?

Launching an Activity within a certain fragment, then going back to the previous Activity from where it was launched?

我一直在努力应对如下特定挑战:

我的应用有一个 activity“A”,它被认为是应用的“主要”activity。在某一时刻,它启动一个 activity “B”,它有一个可用的动作,应该在 activity “A” 内启动一个片段(这不会总是相同的片段,它取决于一些数据来自我们的后端)。

我可以通过简单地以正确的 Intent 调用 startActivity 来做到这一点,但是,在按下后退按钮时,它会返回到 A 的“主要片段”(这是在 A 的 onBackButtonPressed()).本质上,应该发生的事情如下:

Activity A -> Activity B -> Activity A 显示片段 X -> 按回 -> Activity B

使用 startActivity 启动时会发生什么 Activity A:

Activity A -> Activity B -> Activity A 显示片段 X -> 按回 -> Activity A 显示“主要片段”。从这里开始,如果我再次按下应用程序退出,这又是 A 的 onBackButtonPressed 实现的一部分,但是我尝试从调用 A 的意图中检索 extra 以便有条件地带来返回 activity B 但由于我无法弄清楚的原因,Intent 似乎没有任何额外内容。我确定我在 Intent 中正确地放置了额外的内容,因为 activity A 根据我放置的内容从 B 调用时启动了正确的片段。

更多我尝试过的东西:

由于这是我公司应用程序的一部分,已经具有一定的复杂性,我不能随意为您提供有用的代码示例,希望我的描述足以帮助我。

附加信息

targetApi="n"
测试 Android 11
Activity A 的启动模式为“singleTask”
Activity B 的启动模式为“singleTop”

对于预期的行为:

  1. 避免使用任何 launchModetaskAffinity 或 activity 标志,默认行为绝对符合您的要求("standard" 是默认行为发射模式)。因此,当您在 Activity B 中执行操作时,Activity A 的新实例将在将 B 放入后台堆栈后启动,这是默认行为。

  2. 你应该在 Activity A 的 onBackPressed() 中有这样的逻辑:如果片段 X 可见,那么它将退出整个 activity,否则它通过调用 super() 传递。类似于以下内容:

在Activity一个

@Override
public void onBackPressed() {
    Fragment fragment = getFragmentManager().findFragmentByTag("yourTagForFragmentX");
    if (fragment instanceof XFragment) {
        // The fragment is available in the fragment manager
        finish()
    } else {
        super.onBackPressed();
    }
}

更多详情,here

我认为你把事情复杂化了。

  1. 删除 A 和 B 的所有启动模式标志 - 它们应该不是必需的。
  2. 删除 onBackPressed 的自定义处理 - 默认处理应该足够了。
  3. 更新 A 以根据给定的意图将自身初始化为正确的片段:

例如:

onCreate(...) {
    if (getIntent().getAction() == "START_ON_X") {
        // Notice we REPLACE and DO NOT add to back stack
        getFragmentManager().replace(fragID, createXFragment()).commit()
    }
    else {
        getFragmentManager().replace(fragID, createDefaultFragment()).commit()
    }
}

因此,您将拥有:

  1. 默认启动器 Intent 启动 A。
  2. A 启动 B.
  3. B 启动 A 以显示片段 X

这会给你一堆 A -> B -> Ax

然后当您按回车键时,默认行为会让您留在 B 上。

然后再按一次后退键将留在 A 上。

然后再次按下将关闭您的应用程序。

同样,这都是标准的默认行为。吻.