在Android中修改后栈

时间:2012-07-06 17:08:33

标签: android back-stack

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

现在,这是流程:

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

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

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

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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:9)

您可以使用从F到C的标志intent.FLAG_ACTIVITY_CLEAR_TOP构建一个意图。然后您必须使用intent调用startActivity()并触发此事件以发生onBackPressed或类似的事情。

Intent i = new Intent(this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(i)

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

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

  

上例中活动B的当前运行实例将会   要么接收你从这里开始的新意图   onNewIntent()方法,或者自己完成并重新使用new   意图。如果它已宣布其启动模式为“多个”(   默认情况下,您没有设置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);
}

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

答案 1 :(得分:2)

您需要的是android:excludeFromRecents="true",必须在清单文件的活动代码中添加。它会阻止所有活动进入堆栈,并将此标记转换为清单中的活动标记。

示例代码

 <activity
            android:name="com.xx.xx.ActivityName"
            android:excludeFromRecents="true"


        </activity>

并确保在那些您不希望加入活动堆栈的活动中调用finish()(在启动另一个活动之后)方法。