是否有可能在堆栈上启动一个活动,清除它之前的整个历史?

这种情况

我有一个活动堆栈,要么是A->B->C,要么是B->C(屏幕A选择用户令牌,但许多用户只有一个令牌)。

在屏幕C中,用户可能会采取使屏幕B无效的操作,因此应用程序希望将他们带到屏幕A,而不管它是否已经在堆栈中。屏幕A应该是我的应用程序堆栈上的唯一项。

笔记

还有很多类似的问题,但我还没有找到任何答案。我尝试调用getParent().finish() -这总是导致一个空指针异常。FLAG_ACTIVITY_CLEAR_TOP只在活动已经在堆栈上时才有效。


当前回答

案例1:只有两个活动A和B:

这里的活动流程是A->B .从B点击后退按钮,我们需要关闭应用程序,然后从A启动活动B,只需调用finish()这将防止android从存储活动A到Backstack。例如,活动A是应用程序的载入/启动屏幕。

Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();

案例2:两个以上的活动:

如果有像a ->B->C->D->B这样的流程,并且在从活动D进入活动B时单击返回按钮。在这种情况下,我们应该使用。

Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);

由于Intent的原因,Activity B将从backstack而不是一个新实例启动。FLAG_ACTIVITY_CLEAR_TOP和Intent。FLAG_ACTIVITY_NEW_TASK清除堆栈并使其成为顶部堆栈。因此,当我们按下返回按钮时,整个应用程序将终止。

其他回答

有时您的android模拟器可能无法连接eclipse DDMS工具,并要求adb手动启动。在这种情况下,您可以使用命令提示符启动或停止adb。

案例1:只有两个活动A和B:

这里的活动流程是A->B .从B点击后退按钮,我们需要关闭应用程序,然后从A启动活动B,只需调用finish()这将防止android从存储活动A到Backstack。例如,活动A是应用程序的载入/启动屏幕。

Intent newIntent = new Intent(A.this, B.class);
startActivity(newIntent);
finish();

案例2:两个以上的活动:

如果有像a ->B->C->D->B这样的流程,并且在从活动D进入活动B时单击返回按钮。在这种情况下,我们应该使用。

Intent newIntent = new Intent(D.this,B.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);

由于Intent的原因,Activity B将从backstack而不是一个新实例启动。FLAG_ACTIVITY_CLEAR_TOP和Intent。FLAG_ACTIVITY_NEW_TASK清除堆栈并使其成为顶部堆栈。因此,当我们按下返回按钮时,整个应用程序将终止。

在启动一个新活动之后,使用startActivity,确保调用finish(),这样当前活动就不会堆叠在新活动的后面。

高级可重用Kotlin:

您可以直接使用setter方法设置标志。在Kotlin或是取代Java位或|。

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

如果你计划经常使用它,创建一个Intent扩展函数

fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

你可以在启动intent之前直接调用这个函数

intent.clearStack()

如果您需要在其他情况下添加额外标志的选项,请向扩展函数添加可选参数。

fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

试试这个:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();