我正在开发和应用,用户必须先登录才能使用它。我自定义了标题栏并在其中放置了一个注销按钮,以便用户可以随时注销,并使用其他帐户登录。然后应用程序应再次显示登录活动。
效果很好,但我的问题在于后退按钮。当用户注销时,登录活动显示,但如果他按下,则应用程序返回上一页,使用户能够再次使用该活动,即使没有登录也是如此。
我通过这种方式设置了onCreate()
所有活动:
public void onCreate(Bundle savedInstanceState) {
// Activity code
checkLogin();
}
checkLogin()
:
if (GlobalContext.getCurrentUser() == null) {
Intent i = new Intent(this, LoginActivity.class);
startActivityForResult(i, GlobalContext.REQUEST_LOGIN);
}
然而,这不应该像它应该的那样工作,我的应用程序有时会在我按下时崩溃,有时会像我说的那样返回到之前的活动,有时它确实有效。
每次活动(重新)开始时,如何调用checkLogin()
?
或者还有另一种更好的方法来做我想做的事情?
编辑:
根据@ Gabriel的回答和the SDK references中的以下图表,我将checkLogin()
移至onResume()
方法而不是onCreate
,解决了我的问题。
答案 0 :(得分:5)
将来自checkLogin()
的{{1}}移至onCreate()
。
答案 1 :(得分:5)
我建议您将checkLogin()
添加到资源onResume()
,因为在onCreate()
方法中检查它会导致仅在创建活动时调用登录1次。
甚至击球就是把它移到
onAttachToWindow()
所以每次你的活动都会出现在前面。将调用onAttachToWindow()
并检查登录信息。
答案 2 :(得分:4)
在用户登录的fisrt活动中,尝试在SharedPreferences上保存变量,如下所示:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("logged", true); // set it to false when the user is logged out
// Commit the edits!
editor.commit();
然后在你的每个Activity中,设置此代码以检查用户是否已登录,如果他没有登录,那么将他重定向到LoginActivity,如下所示:
@Override
protected void onStart(Bundle state){
super.onStart(state);
. . .
// Restore preferences
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean loggedIn = settings.getBoolean("logged", true);
if(!loggedIn){
Toast.makeText(this,"you are not logged in !!",3000).show();
Intent i = new Intent(this,LoginActivity.class);
startActivity(i);
}
}