我的应用程序有许多可以按任何顺序调用的活动
活动历史记录示例: A - > B - > C - > D - > A - > B - > ë
现在在活动E中,我“取消注册”设备(将用户注销,并删除他们可能已下载到其SD卡的任何数据)。欲望行为是应用程序'重新开始'并且用户被提示登录活动并且回击将使用户返回主屏幕。
现在,活动E应该以某种方式清除活动堆栈。目前,我在从E启动A的意图时设置FLAG_ACTIVITY_CLEAR_TOP。问题是,当用户访问A然后进入中间活动并在转到E之前重新访问A时,堆栈上仍有活动。
A - > B - > C - > D - >甲
因此用户已注销并且无法使用活动B-D,但如果用户从活动A返回,则他们可以访问活动B-D。是否有一种简单的方法可以从堆栈中清除除登录活动之外的所有活动?
更新
所以我尝试更新我的BaseActivity(我的应用程序子类中的每个活动)以包含一个静态标志isDeregistering,告诉活动如果为true则销毁自己。问题是,每个活动调用finish(),然后我被启动到主屏幕,并且在强制关闭应用程序之前无法重启应用程序。有更好的方法吗?
答案 0 :(得分:3)
我找到了一个可行的解决方案。以下代码进入我的BaseActivity类。
public boolean killIfDeregistering() {
if (isDeregistering) {
Log.d(TAG, "deregistering true!");
if (getClass().getName().equals(LoginActivity.class.getName())) {
//don't destroy activity, reset flag
Log.d(TAG, "stopping deregister process!");
isDeregistering = false;
} else {
//finish the activity
Log.d(TAG, "killing this activity!");
finish();
return true;
}
}
return false;
}
使用一点反射,我可以决定是否终止基本活动,以便主启动器可以在LoginActivity
重新启动应用程序。我只需要确保LoginActivity在通过手动调用finish()
执行登录后不会保留在堆栈中。
答案 1 :(得分:0)
如果您想从活动E返回到第一个活动A,销毁所有中间活动,您可以使用FLAG_ACTIVITY_CLEAR_TASK |启动您的意图。 FLAG_ACTIVITY_CLEAR_TOP