在Android中修改后栈

mwr*_*zam 6 android back-stack

我想在我的Android应用程序中修改后台堆栈:

现在,这是流程:

A - > B - > C - > D - > E - > F.

我希望能够修改后台堆栈,这样当用户进入活动F时,D和E将从堆栈中删除.因此,如果用户击中背部,则流量为F - > C.

此外,从F,用户能够进入活动B,这也应该擦除C,D,E和F.

我已经看到了一些关于能够清除堆栈或删除顶部项目的信息,但是我想在触发活动时从堆栈中删除一些项目.

感谢任何帮助,非常感谢.

mat*_*784 9

您可以使用intent.FLAG_ACTIVITY_CLEAR_TOP从F到C 的标志构建一个intent .然后,您必须使用intent调用startActivity()并触发它以发生onBackPressed或类似的东西.

Intent i = new Intent(this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i)
Run Code Online (Sandbox Code Playgroud)

请参阅此答案,该答案还涉及确保在导航回来时不会重新启动C:https://stackoverflow.com/a/11347608/1003511

我们FLAG_ACTIVITY_CLEAR_TOP将做的是回到堆栈上最新的活动C实例,然后清除它上面的所有内容.但是,这可能会导致重新创建活动.如果您想确保它与活动的实例相同,请同时使用FLAG_ACTIVITY_SINGLE_TOP.从文档:

上面示例中当前运行的活动B实例将在其onNewIntent()方法中接收您从此处开始的新意图,或者本身已完成并使用新意图重新启动.如果它已将其启动模式声明为"多个"(默认值)并且您没有在同一意图中设置FLAG_ACTIVITY_SINGLE_TOP,那么它将被完成并重新创建; 对于所有其他启动模式或如果设置了FLAG_ACTIVITY_SINGLE_TOP,则此Intent将被传递到当前实例的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);
}
Run Code Online (Sandbox Code Playgroud)

代码示例源:https://stackoverflow.com/a/9398171/1003511