在按下时跳过直接返回到父项活动

时间:2012-04-18 04:43:56

标签: android android-intent

我正在处理的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.

如果有人能够提供更好的方法来解决这个循环的场景,那将是很棒的!

8 个答案:

答案 0 :(得分:19)

很简单!! 当你从B开始活动C时,使用B.finish()。这样的事情。

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

这将从堆栈中删除B!

答案 1 :(得分:11)

可能迟到了,但对于那些可能在搜索中发现这一点的人: 你可以添加

        android:noHistory="true"

到AndroidManifest中的活动B. 这也将避免在C返回结果时在活动B中调用onActivityResult()方法。一旦你开始C,我基本上就像B消失了。

答案 2 :(得分:2)

为此活动设置B活动的标志

private boolean mDestroyActivity = false;

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

for activity B onStop方法添加如下检查:

if (mDestroyActivity) finish();

然后当您按下C中的后退按钮时,您将跳回到A.

答案 3 :(得分:1)

您可以使用startActivityForResult()启动活动C,并在onActivityResult()内完成活动B.

启动活动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();
            }
        }
    }

在活动C中,在setResult(Activity.RESULT_OK)

之前使用finish();

<强>更新

另一种方法是使用FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP从活动C开始活动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已经完成。

答案 4 :(得分:1)

请在启动新活动

之前设置此FLAG

intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

答案 5 :(得分:1)

活动代码中值下方的清单文件中提及

  

android:noHistory =“ true”

然后它将跳过活动

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

  • 在活动B中:

    公共静态布尔值mDestroyActivity = false; @Override     受保护的void onResume(){         super.onResume();         / **          *从活动C-> A返回时退出(跳过活动B)          * /         Log.i(“ FINISH”,“ =” + mDestroyActivity);         如果(mDestroyActivity){             mDestroyActivity = false;             完();         }     }

  • 在活动C中:

    B.mDestroyActivity = true;