Android中后退栈的修改

6
我希望能修改我 Android 应用程序中的返回堆栈,如下所示:
现在,流程是这样的:
A -> B -> C -> D -> E -> F
我想要能够修改返回堆栈,使得当用户到达 F 活动时,D 和 E 会从堆栈中清除。因此,如果用户点击返回,流程就是 F -> C。
此外,从 F 开始,用户可以转到 B 活动,这也应该清除 C、D、E 和 F。
我已经看到一些有关清除堆栈或删除顶部项的信息,但我想在触发某个活动时从堆栈中删除多个项目。
非常感谢您的帮助。
2个回答

10

你可以使用标记intent.FLAG_ACTIVITY_CLEAR_TOP从F构建一个意图到C。接下来,你需要调用startActivity()函数并使用这个意图,在onBackPressed或类似情况下触发该函数。

Intent i = new Intent(this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i)
请参考此答案,该答案还讨论了如何确保在返回C时不会重新启动它:https://dev59.com/EWXWa4cB1Zd3GeqPQMUj#11347608 FLAG_ACTIVITY_CLEAR_TOP 的作用是回到活动栈中最近的 C 活动实例,然后清除在它之上的所有内容。但是,这可能会导致活动被重新创建。如果想确保它是同一个活动实例,请同时使用 FLAG_ACTIVITY_SINGLE_TOP。 根据文档:
“在上面的示例中,正在运行的 B 活动实例将接收您在此处开始的新意图,并在其 onNewIntent() 方法中处理,或者自己结束并使用新意图重新启动。如果它已将启动模式声明为“多个”(默认),并且您没有在同一意图中设置 FLAG_ACTIVITY_SINGLE_TOP,则它将被完成并重新创建;对于所有其他启动模式或者如果设置了 FLAG_ACTIVITY_SINGLE_TOP,则此意图将被传递到当前实例的 onNewIntent() 方法中。”
编辑:这里有一个代码示例与您要做的类似:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent a = new Intent(this, C.class);
        a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(a);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

代码示例来源:https://dev59.com/AW855IYBdhLWcg3wbz1l#9398171


2
你需要的是在清单文件中的Activity标签中添加android:excludeFromRecents="true"。这将阻止所有具有此标签的Activity进入堆栈。
示例代码:
 <activity
            android:name="com.xx.xx.ActivityName"
            android:excludeFromRecents="true"


        </activity>

确保在那些你不想保留在活动堆栈中的活动中调用finish()方法(在启动另一个活动之后)。


你好,这会让活动完全从历史记录中消失,这不是我想要的。我希望只有在触发某个特定的活动后才会消失。感谢您的帮助! - mwrazam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接