在Android中,我有一些活动,比如A B C。

在A中,我用下面的代码打开B:

Intent intent = new Intent(this, B.class);
startActivity(intent);

在B中,我用下面的代码打开C:

Intent intent = new Intent(this, C.class);
startActivity(intent);

当用户点击C中的一个按钮时,我想回到a并清除back堆栈(关闭B和C)。所以当用户使用后退按钮B和C不会出现时,我一直在尝试以下方法:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

但是当我回到活动a时,如果我使用后退按钮,B和C仍然会显示出来。我该如何避免这种情况?


当前回答

我尝试了所有的解决方案,但没有一个单独对我有效。 我的解决方案是:

在android manifest中使用[android:launchMode=" SingleTop "]将活动A声明为SingleTop。

现在,在从任何地方启动A时添加以下标志。它将清空堆栈。

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();

其他回答

如果你的应用程序有最低sdk版本16,那么你可以使用 finishAffinity ()

完成此活动以及当前任务中紧接在其下面的具有相同关联的所有活动。

这是我的工作 在顶部支付屏幕删除所有后台活动,

 @Override
public void onBackPressed() {
         finishAffinity();
        startActivity(new Intent(PaymentDoneActivity.this,Home.class));
    } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

试着用

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

而不是

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

给定的代码可以正常工作。我在应用程序生命周期示例中尝试过。

我没有得到B和C在后面的堆栈开始活动A与标志,FLAG_ACTIVITY_CLEAR_TOP

我是这样解决这个问题的:

private boolean clearHistoryBackStack = true;

@Override
public final void finish() {
    super.finish();

    if(clearHistoryBackStack)
        finishAffinity();
}

从API 16 (Jelly Bean)开始,你可以调用finishAffinity()。

现在你也可以调用ActivityCompat。finishAffinity(活动活动)与兼容性库。

确保将清单中的taskAffinity设置为该组活动唯一的包名。

查看更多信息: http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29