6

我正在开发的 Android 应用程序中遇到了一个小问题:

有 3 个活动,即 A 、 B 、 C ,调用顺序如下:A -> B -> C。而在 C 中,当我按下 BACK 按钮时,它应该返回 A[而不是 B 默认情况下]。在 A 中按 BACK 将退出程序。

我试图将意图从 C 调用到 A。但在这种情况下,调用调用进入一个循环:A -> B -> C -> A,因为新活动被推送到堆栈顶部。结果,当在 A 处按下 BACK 时,不是退出 [A 是开始],而是转到 C,然后是 B,然后再回到 A,这是一个不必要的循环。

如果有人可以提供更好的方法来解决这种循环场景,那就太好了!

4

8 回答 8

21

很简单!!当您从 B 开始活动 C 时,使用 B.finish()。像这样的东西。

Intent i = new Intent(B.this, C.class);
B.this.finish();
startActivity(i);

这将从堆栈中删除 B!

于 2012-04-18T04:53:57.853 回答
12

可能晚了,但对于可能在搜索中找到此内容的人:您可以添加

        android:noHistory="true"

到您的 AndroidManifest 中的活动 B。这也将避免当 C 返回结果时在活动 B 中调用 onActivityResult() 方法。我基本上就像你启动 C 时 B 消失一样。

于 2012-11-22T12:24:59.947 回答
2

像这样为 B 活动设置一个标志

private boolean mDestroyActivity = false;

当您调用 startActivity C 时将该标志设置为 true。

对于活动 B onStop 方法,添加如下检查:

if (mDestroyActivity) finish();

然后,当您按下 C 中的返回按钮时,您将跳回 A。

于 2012-04-18T04:49:08.317 回答
1

您可以使用结束活动 B开始活动startActivityForResult()C。onActivityResult()

要开始活动 C,

Intent intent = new Intent(ActivityB.this, ActivityC.class);
startActivityForResult(intent, 123);

并在活动 B 中覆盖

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if(requestCode == 123){
            if(resultCode == Activity.RESULT_OK){
                finish();
            }
        }
    }

而在Activity C里面使用setResult(Activity.RESULT_OK)之前finish();

更新:

另一种方法是使用FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP从 Activity C 启动 Activity A。

Intent intent = new Intent(ActivitC.this, ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

当您开始活动 C 时,另一种方法可能只是finish()活动 B。因此,当您按回活动 C 时,它将直接移动到活动 A,因为活动 B 已经完成。

于 2012-04-18T04:49:34.457 回答
1

请在启动新 Activity 之前设置此 FLAG

意图.setFlags(意图.FLAG_ACTIVITY_NO_HISTORY);

于 2012-04-18T04:55:30.037 回答
1

在清单文件中提及活动标签中的值低于

机器人:noHistory =“真”

然后它将跳过活动

于 2018-07-20T10:38:53.463 回答
0

我认为你不应该打破正常流程。C应该先返回B然后A。

无论如何我都可以解决您的问题。在 A 活动中注册广播接收器,然后从 C 向 A 发送广播。在 A 活动中,您可以接收该广播,然后清除堆栈。这将自动完成所有子活动。

覆盖 onbackpress 并且不要在 onbackpress 中调用 super 而是向活动 A 发送广播。

于 2012-04-18T05:03:36.627 回答
0
  • 在活动 B 中:

    公共静态布尔 mDestroyActivity = false; @Override protected void onResume() { super.onResume(); /** * 从活动 C-> A 返回时退出(跳过活动 B) */ Log.i("FINISH", "= " + mDestroyActivity); if (mDestroyActivity) { mDestroyActivity = false; 结束(); } }

  • 在活动 C 中:

    B.mDestroyActivity = true;

于 2019-03-09T09:06:34.127 回答