Intent.FLAG_ACTIVITY_CLEAR_TOP无法清空返回栈,返回键仍显原页面的问题
解决跳转Activity时清空所有其他Activity的问题
嘿,我明白你的困扰——用Intent.FLAG_ACTIVITY_CLEAR_TOP没达到预期效果,返回键还是回到之前的页面,这其实是因为这个flag的作用和你想的有点不一样。
为什么FLAG_ACTIVITY_CLEAR_TOP没生效?
FLAG_ACTIVITY_CLEAR_TOP的核心作用是:如果目标Activity(这里是WelcomeActivity)已经存在于当前任务栈中,它会清除目标Activity之上的所有Activity,并复用已有的目标Activity实例。但如果目标Activity不在栈里,这个flag就完全不起作用;而且就算复用了实例,当前的LoginActivity还是留在栈中,所以返回键会回到它。
正确的解决方案
要彻底清空所有其他Activity,让新启动的Activity成为任务栈的唯一页面,推荐使用**FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TASK**的组合,再配合finish()关闭当前Activity:
Intent intent = new Intent(LoginActivity.this, WelcomeActivity.class); // 清空整个任务栈,并将新Activity作为新任务的根 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); progressDialog.dismiss(); // 关闭当前的LoginActivity,确保它也不会留在栈中 finish();
各flag的作用解释
FLAG_ACTIVITY_CLEAR_TASK:强制清空当前任务栈中的所有ActivityFLAG_ACTIVITY_NEW_TASK:配合前者,确保新启动的WelcomeActivity成为新任务栈的根Activityfinish():关闭当前的LoginActivity,避免它留在栈中(如果不需要保留的话)
另一种可选方案(如果目标Activity已存在于栈中)
如果WelcomeActivity已经在任务栈里,你也可以用FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP的组合,但别忘了关闭当前Activity:
Intent intent = new Intent(LoginActivity.this, WelcomeActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); progressDialog.dismiss(); finish();
这个组合会清除WelcomeActivity之上的所有Activity,并复用它的实例,加上finish()后,返回键就不会回到LoginActivity了。
内容的提问来源于stack exchange,提问作者Muhammad Yaseen
相关产品推荐
相关产品推荐

