在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仍然会显示出来。我该如何避免这种情况?


当前回答

在意图中添加NO历史标志。

在活动B中,启动活动C,如下所示>>>>>>

Intent intent = new Intent(this, C.class);
intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent);
finish();

其他回答

或者把这个添加到你的活动B和活动C中

android:noHistory="true"

或覆盖onBackPressed函数以避免返回。

@Override
public void onBackPressed() {
   return;
}

在我看来,你需要使用startActivityForResult()从活动B启动活动C。当您单击活动C中的按钮时,调用setResult(RESULT_OK)和finish(),这样活动C就结束了。在活动B中,你可以让onActivityResult()通过对自身调用finish()来响应,然后你会被带回活动A。

根据Wakka在从历史堆栈中移除一个活动…


在AndroidManifest.xml中将android:noHistory="true"属性添加到<activity>中,如下所示:

    <activity android:name=".MyActivity"
        android:noHistory="true">
    </activity>

意图。FLAG_ACTIVITY_CLEAR_TOP在这种情况下将不起作用。请使用(意图。FLAG_ACTIVITY_NEW_TASK

欲了解更多细节,请查看此文档。

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

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

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

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