在某个片段中启动一个 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 调用时启动了正确的片段。
更多我尝试过的东西:
直接从 B 中启动所需的片段,但是这样片段不会与 A 中存在的导航栏一起显示,似乎显示 activity B 后面的主要内容片段的元素,这在用户体验方面是不可取的。
使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
标志,这似乎没有任何区别。
由于这是我公司应用程序的一部分,已经具有一定的复杂性,我不能随意为您提供有用的代码示例,希望我的描述足以帮助我。
附加信息
targetApi="n"
测试 Android 11
Activity A 的启动模式为“singleTask”
Activity B 的启动模式为“singleTop”
对于预期的行为:
避免使用任何 launchMode
、taskAffinity
或 activity 标志,默认行为绝对符合您的要求("standard"
是默认行为发射模式)。因此,当您在 Activity B 中执行操作时,Activity A 的新实例将在将 B 放入后台堆栈后启动,这是默认行为。
你应该在 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
我认为你把事情复杂化了。
- 删除 A 和 B 的所有启动模式标志 - 它们应该不是必需的。
- 删除
onBackPressed
的自定义处理 - 默认处理应该足够了。
- 更新 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()
}
}
因此,您将拥有:
- 默认启动器 Intent 启动 A。
- A 启动 B.
- B 启动 A 以显示片段 X
这会给你一堆 A -> B -> Ax
然后当您按回车键时,默认行为会让您留在 B 上。
然后再按一次后退键将留在 A 上。
然后再次按下将关闭您的应用程序。
同样,这都是标准的默认行为。吻.
我一直在努力应对如下特定挑战:
我的应用有一个 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 调用时启动了正确的片段。
更多我尝试过的东西:
直接从 B 中启动所需的片段,但是这样片段不会与 A 中存在的导航栏一起显示,似乎显示 activity B 后面的主要内容片段的元素,这在用户体验方面是不可取的。
使用
Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
标志,这似乎没有任何区别。
由于这是我公司应用程序的一部分,已经具有一定的复杂性,我不能随意为您提供有用的代码示例,希望我的描述足以帮助我。
附加信息
targetApi="n"
测试 Android 11
Activity A 的启动模式为“singleTask”
Activity B 的启动模式为“singleTop”
对于预期的行为:
避免使用任何
launchMode
、taskAffinity
或 activity 标志,默认行为绝对符合您的要求("standard"
是默认行为发射模式)。因此,当您在 Activity B 中执行操作时,Activity A 的新实例将在将 B 放入后台堆栈后启动,这是默认行为。你应该在 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
我认为你把事情复杂化了。
- 删除 A 和 B 的所有启动模式标志 - 它们应该不是必需的。
- 删除
onBackPressed
的自定义处理 - 默认处理应该足够了。 - 更新 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()
}
}
因此,您将拥有:
- 默认启动器 Intent 启动 A。
- A 启动 B.
- B 启动 A 以显示片段 X
这会给你一堆 A -> B -> Ax
然后当您按回车键时,默认行为会让您留在 B 上。
然后再按一次后退键将留在 A 上。
然后再次按下将关闭您的应用程序。
同样,这都是标准的默认行为。吻.