安卓清除中间的活动页面

3

我有5个活动,

A - 基础活动

B,C,D - 普通活动

E - 最终活动

A-B-C-D-E

我从A到B到C到D导航,D带我到E。我想要的行为是:如果我在D上按返回按钮,则应将我带回C,从C的返回按钮应将我向下带回B到A。但是,如果我从D移动到Activity E,则希望从E的返回按钮跳过B,C和D将我带回A。


你尝试过在Activity E中重写onBackPressed方法以导航到A吗? - Muhannad Fakhouri
3个回答

4
E 中:
@Override
public void onBackPressed() {
    Intent intent = new Intent(this, ActivityA.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
}

这将回到A,完成BCDE

使用FLAG_ACTIVITY_SINGLE_TOP可以确保您返回到现有的A实例。如果还想结束现有的A实例并创建一个新的实例进行返回,则只需删除FLAG_ACTIVITY_SINGLE_TOP即可。


谢谢。这正是我正在寻找的。 - Sahil Gupta

1
您可以使用静态变量来跟踪您来自哪个活动。然后重写onBackPressed方法来检查该变量并移动到适当的活动。类似于以下内容:
public static Boolean skipActivities = false;

从D启动E活动时,请将其设置为true。对于您的E活动:
@Override
public void onBackPressed() {
    if (skipActivities){
        //start activity A, skipActivities should be reset to false also
    } else {
        super.onBackPressed();
    }
}

1
使用static变量是错误的方法。这是不良的架构设计。有简单的Intent标志可以完全满足OP的需求。 - David Wasser

0

你可以使用 affinity 来“分组”你的活动。 因此,在清单文件中将 android:taskAffinity="activity.normal" 添加到B、C、D、E活动中。现在,通过调用 finishAffinity()(而不是通常的 finish())即可在任何这些活动中完成该组中的所有活动。在你的情况下,你只需将其添加到E活动中:

@Override
public void onBackPressed() {
    finishAffinity();
    super.onBackPressed();
}

糟糕的答案。使用taskAffinity来实现这个目的是完全错误的。不仅如此,这个功能只存在于API级别16及以上。如果在清单中的不同活动中提供不同的taskAffinity,你很快就会得到应用程序的2个任务,这绝对不是你想要的,也不是用户所期望的。这样做会打开一个大问题,你需要完全理解才能做到。有简单的Intent标志可以做到OP想要的事情,并且它适用于API级别1及更高版本。 - David Wasser
谢谢!不知道有这样的标志! - borichellow

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