6

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

现在,这是流程:

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

我希望能够修改返回堆栈,以便当用户进入活动 F、D 和 E 时从堆栈中删除。因此,如果用户击中背部,则流程为 F -> C。

此外,用户可以从 F 转到活动 B,这也应该删除 C、D、E 和 F。

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

任何帮助表示赞赏,非常感谢。

4

2 回答 2

10

您可以使用从 F 到 C 的标志构建一个意图intent.FLAG_ACTIVITY_CLEAR_TOP。然后您必须使用该意图调用 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 ://stackoverflow.com/a/11347608/1003511

要做FLAG_ACTIVITY_CLEAR_TOP的是回到堆栈上最近的活动 C 实例,然后清除它上面的所有内容。但是,这可能会导致重新创建活动。如果你想确保它是同一个活动实例,也可以使用FLAG_ACTIVITY_SINGLE_TOP。从文档中:

上面示例中当前运行的活动 B 实例将在其 onNewIntent() 方法中接收您在此处启动的新意图,或者自身完成并使用新意图重新启动。如果它已声明其启动模式为“multiple”(默认)并且您没有在同一意图中设置 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

于 2012-07-06T17:35:55.030 回答
2

您需要的是 android:excludeFromRecents="true"必须在清单文件的 Activity 标记中添加哪个。它停止所有活动进入堆栈,该堆栈具有此标记到清单中的 Activity 标记中。

示例代码

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


        </activity>

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

于 2012-07-06T17:14:55.877 回答