如何通过Firebase在我的Android应用程序中保持用户持久登录

3

我目前正在使用Android Studio编写一个应用程序,使用Firebase。我的问题是,当我登录后如何在整个应用程序的生命周期中保持登录状态,直到我选择退出登录。

到目前为止,在MainActivity中我已经做了以下工作:

/* *************** IN MAINACTIVITY *************** */
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /* Firebase init */
    Firebase.setAndroidContext(this);
    rootRef = new Firebase(URL);

   /* Other Android code
      ...                  
    */

   firebaseAuthLisener = new Firebase.AuthStateListener() {
        @Override
        public void onAuthStateChanged(AuthData authData) {
            if (authData != null) {
                // user is logged in
                System.out.println("Logged in!");
            } else {
                // user is not logged in
                System.out.println("Not logged in!");
            }
        }
   };
}

/* The Login function gets me to the LoginActivity */
public void Login() {
    Intent intent = new Intent(this,  LoginActivity.class); 
    int reqCode = 1; 
    startActivityForResult(intent, reqCode); 
}

当调用Login()函数时,我会进入LoginActivity,目前我在LoginActivity中所做的是

/* *************** IN LOGINACTIVITY *************** */
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /* Firebase init */
    rootRef = new Firebase(URL);

    /* Other Android code
      ...                  
     */

   loginResultCallback = new Firebase.AuthResultHandler() {
        @Override
        public void onAuthenticated(AuthData authData) {
           activityDone();
        }
        @Override
        public void onAuthenticationError(FirebaseError firebaseError) {
           System.out.println("Error couldn't login");
        }
   };
}

/* The loginFirebase function logs me into the Firebase */
public void loginFirebase() {
    rootRef.authWithPassword("EMAIL", "PASSWORD", loginResultCallback);
} 

/* The activityDone function returns me to MainActivity */
public void activityDone() {
    Intent resultForMainActivityIntent = new Intent();
    setResult(Activity.RESULT_OK, resultForMainActivityIntent);
    finish();
} 

如前所述,当我调用activityDone()后,如何在整个应用程序的生命周期内保持我的登录状态,直到我选择注销?

编辑:如果其他人发现这个帖子,我在这里做错的事情实质上是没有使用回调,另一种重写MainActivity的方法:

/* *************** IN MAINACTIVITY *************** */
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

   /* Firebase init */
   Firebase.setAndroidContext(this);
   rootRef = new Firebase(URL);

   /* Other Android code
      ...                  
    */

    rootRef.addAuthStateListener(new Firebase.AuthStateListener() {
        @Override
        public void onAuthStateChanged(AuthData authData) {
            Log.i(">firebaseAuthLisener<", "[CALLED]");

            if (authData != null) {
                // user is now logged in
                System.out.println("Logged in!");
            } else {
                // user is not logged in
                System.out.println("Not logged in!");
            }
        }
    });
}

/* The Login function gets me to the LoginActivity */
public void Login() {
   Intent intent = new Intent(this,  LoginActivity.class); 
   int reqCode = 1; 
   startActivityForResult(intent, reqCode); 
}

现在应该在从LoginActivity返回后立即执行。感谢Frank van Puffelen的贡献,还可以参考:github上的登录演示

2个回答

2
当您的应用程序用户使用Firebase进行身份验证时,Firebase客户端将令牌存储在用户Android设备上的共享首选项中。因此,当应用程序重新启动时,用户已经通过身份验证(除非令牌已过期)。
因此,通常只有在onAuthStateChanged()authDatanull时才调用Login()(或显示“登录”按钮)。

好的,但是当我从_LoginActivity_返回时,如果我尝试这种方法,onAuthStateChanged()不会自动调用。也许我应该在代码中的某个地方手动启动它(在这种情况下检查用户特定资源如UID的正确方法是什么)? - user5586509
不需要启动 LoginActivity。当您在 MainActivity.onCreate() 中注册时,AuthStateListener.onAuthStateChanged() 应立即触发。如果这对您没有发生,请在 github 上设置一个 mcve - Frank van Puffelen

0
我建议您在登录主 Activity 后,将已登录状态存储在 sharedPref 中,并移动到您的主 Activity。
下次用户打开应用程序时,请检查 sharedPref 是否设置为“logged”并将其移至主 Activity。在 mainActivity 的 onCreate() 方法中使用 Firebase 进行身份验证,从而在 Firebase 中维护已登录状态。
希望能对您有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接