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


当前回答

使用此代码启动一个新的活动,并关闭或销毁所有其他活动堆栈或回栈。

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

其他回答

如果你的应用程序有最低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

这是一个非常老的答案,我并没有真正找到一个适当的解决方案,以清除backStack的唯一目的,我决定创建自己的backStack,这甚至不是一个堆栈tbh,但它不必是,因为我们想要清除它的一切;

每次都有一个把手的背架的开销,但它给了我需要的控制;


首先声明一个公共的静态活动列表(或片段,无论你需要什么);

public static ArrayList <Activity> backStack = new ArrayList<>();

在所有其他活动的onCreate方法中:

MainActivity.backStack.add(this);

最后,当你想要清除backstack时,简单地调用:

public static void killBackStack () {
    for (Activity ac : backStack) {
        if (ac != null)
            ac.finish();
    }
}

尽管这可能来得晚了。当我试图从活动A -> B -> C -> D移动到B时,我遇到了同样的问题,如果D返回true,我想清除活动D和C。

val intent = Intent(this, ActivityUpload::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)

我得到了文档中描述的解决方案。

例如,考虑一个由下列活动组成的任务:a、B、C、D。如果D调用startActivity()时带有一个解析为活动B的组件的Intent,那么C和D将被完成,B接收到给定的Intent,导致堆栈现在是:a, B。

芬兰湾的科特林的例子:

      val intent = Intent(this@LoginActivity, MainActivity::class.java)
      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
      startActivity(intent)
      finish()

使用此代码启动一个新的活动,并关闭或销毁所有其他活动堆栈或回栈。

Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);