是否有可能在堆栈上启动一个活动,清除它之前的整个历史?
这种情况
我有一个活动堆栈,要么是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的后退按钮应该像浏览器一样工作。
我能想出一个办法来做这件事,但这太麻烦了。
使你的活动singleTask添加到AndroidManifest
例子:
<活动android: name = " .activities.A "
android: label = " @string / A_title”
android: launchMode = " singleTask " / >
<活动android: name = " .activities.B "
android: label = " @string / B_title”
android: launchMode = " singleTask " / >
扩展应用程序,它将保存到哪里去的逻辑。
例子:
public class DontHackAndroidLikeThis extends Application {
private Stack<Activity> classes = new Stack<Activity>();
public Activity getBackActivity() {
return classes.pop();
}
public void addBackActivity(Activity activity) {
classes.push(activity);
}
}
从A到B:
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(A.class);
startActivity(this, B.class);
从B到C:
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.addBackActivity(B.class);
startActivity(this, C.class);
在C:
If ( shouldNotGoBackToB() ) {
DontHackAndroidLikeThis app = (DontHackAndroidLikeThis) getApplication();
app.pop();
}
并从堆栈中处理pop()的返回按钮。
再说一次,你不应该这样做:)
案例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清除堆栈并使其成为顶部堆栈。因此,当我们按下返回按钮时,整个应用程序将终止。