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

这种情况

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

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

笔记

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


当前回答

我也在这上面花了几个小时……并且同意FLAG_ACTIVITY_CLEAR_TOP听起来像你想要的:清除整个堆栈,除了正在启动的活动,所以Back按钮退出应用程序。然而,正如Mike Repass所提到的,FLAG_ACTIVITY_CLEAR_TOP只在你正在启动的活动已经在堆栈中时才有效;当活动不存在时,标志不做任何事情。

怎么办呢?将正在启动的活动与FLAG_ACTIVITY_NEW_TASK一起放在堆栈中,这将使该活动成为历史堆栈中新任务的开始。然后添加FLAG_ACTIVITY_CLEAR_TOP标志。

现在,当FLAG_ACTIVITY_CLEAR_TOP在堆栈中查找新活动时,它就在那里,并在清除其他所有内容之前被拉起。

这是我的注销函数;View参数是函数所附加的按钮。

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

其他回答

试试这个:

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();

Android的新版本>= API 16使用finishAffinity()

方法适用于>= API 16。

Intent mIntent = new Intent(mContext,MainActivity.class);
finishAffinity();
startActivity(mIntent);

它是相同的启动新的活动,并清除所有堆栈。 或者重启到MainActivity/FirstActivity。

我发现太简单的hack只是这样做,在AndroidManifest中添加新元素:-

<activity android:name=".activityName"
          android:label="@string/app_name"
          android:noHistory="true"/>

android:noHistory将清除堆栈中不需要的活动。

我也在这上面花了几个小时……并且同意FLAG_ACTIVITY_CLEAR_TOP听起来像你想要的:清除整个堆栈,除了正在启动的活动,所以Back按钮退出应用程序。然而,正如Mike Repass所提到的,FLAG_ACTIVITY_CLEAR_TOP只在你正在启动的活动已经在堆栈中时才有效;当活动不存在时,标志不做任何事情。

怎么办呢?将正在启动的活动与FLAG_ACTIVITY_NEW_TASK一起放在堆栈中,这将使该活动成为历史堆栈中新任务的开始。然后添加FLAG_ACTIVITY_CLEAR_TOP标志。

现在,当FLAG_ACTIVITY_CLEAR_TOP在堆栈中查找新活动时,它就在那里,并在清除其他所有内容之前被拉起。

这是我的注销函数;View参数是函数所附加的按钮。

public void onLogoutClick(final View view) {
    Intent i = new Intent(this, Splash.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

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