我想在我的Android应用中建模的功能是,如果用户登录,他会被转发到主菜单(MainMenuActivity
)。从这里和我在应用程序中为其提供按钮的其他地方,他必须能够注销,这应该将他发送回登录屏幕(LoginActivity
)并完成堆栈上面的所有活动。我通过在登录和注销后不破坏LoginActivity来实现这一点:
Intent intent = new Intent(this, LoginActivity.class);
// Clean up all other activities.
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
此外,我希望用户无法使用主菜单的backbutton返回到登录屏幕。所以我确实覆盖了onBackPressed()
中的方法MainMenuActivity
。相反,我希望当用户从主菜单按下后退按钮时,应用程序会终止(就像它在堆栈上的最后一个活动一样)。 如何实现这一目标?
我确实阅读了其他几种方法,例如在执行登录后完成LoginActivity,然后再按照此处所述进行操作:
https://stackoverflow.com/a/3008684/1332314
但我不太确定这是否是一个合适的解决方案,只需阅读帖子下面的评论。
答案 0 :(得分:1)
显然我确实找到了解决问题的方法。我只是从MainMenuActivity
这样开始LoginActivity
:
private void continueToMainMenu() {
Intent intent = new Intent(this, MainMenuActivity.class);
startActivityForResult(intent, 0);
}
然后,当用户按下主菜单中的后退按钮时,将调用此覆盖函数:
public void onBackPressed() {
setResult(LoginActivity.ACTION_QUIT);
finish();
}
这将首先为LoginScreen
设置结果代码,然后完成MainMenuActivity
。然后LoginActivity
终止接收这个特定的结果代码,我实现了这样的结果:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == LoginActivity.ACTION_QUIT)
{
finish();
}
}
这样做可以确保不会触及活动生命周期太深,所有要清理的回调仍然会被调用,并且不应该打开任何安全漏洞。
希望如果其他人遇到同样的问题,这会有所帮助。
答案 1 :(得分:1)
移至MainMenuActivity
时使用此标记:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
这将删除之前的所有活动,如果您按后退应用将被关闭。
现在,在退出按钮的情况下,当您移动到LoginActivity
同样的标志时,同样的事情现在将使LoginActivity成为堆栈上的唯一活动,并且将关闭后面的应用程序。