保存登录状态,逻辑错误与共享流程并传递bundle



我正在开发我的第一个网络应用程序,并且有一个小问题,我无法找到解决方案。

在我的启动屏幕上,这是我的主要活动,可以选择登录。如果登录,我的登录类将每个意图的数据传递给我的主要活动,以便我可以更新UI。这是我的主要活力:

    // Just to make sure Loginstatus is false on first run
    loginstatus = false;
   //Get saved data from SharedPreferences
    loginstatus = PreferenceData.getUserLoggedInStatus(this);
    Log.d("Loginstatus",""+loginstatus);
    if (extras != null) {
            login = extras.getString("loginy");
            idt = extras.getString("id");
            name = extras.getString("name");
            vorname = extras.getString("vorname");
            email = extras.getString("login");
            zsm = vorname + " " + name;
    }
    else {
        // Take saved Data instead the Bundle Data form first Login
        idt = PreferenceData.getUSERID(this);
        name = PreferenceData.getNachname(this);
        vorname  = PreferenceData.getVorname(this);
        email = PreferenceData.getLoggedInEmailUser(this);
    }

显然,额外的启动无效。如果登录成功,我的登录类传递数据,并且我的主要活动再次调用,因此Extras不是null,我可以通过该信息更新我的UI。此外,如果登录为true,我将数据保存在sharedPrefernces中。

问题是,我想在关闭应用程序完成后保存我的登录状态。因此,我重新打开了我的应用程序,我想使用我的共享prefernces数据,但是某种程度上的附加功能仍然没有零,我找不到解决此问题的方法。

这就是我处理登录方式。希望这很有帮助。

登录活动

保持一个共享的首选项值以检查登录状态,将默认值设置为false;

@Override
    protected void onResume() {
        super.onResume();
        if (sharedpreferences.getBoolean("firstRun", true)) {
            initializeDatabase();
            sharedpreferences.edit().putBoolean("firstRun", false).apply();
            sharedpreferences.edit().putBoolean("attendance", false).apply();
            sharedpreferences.edit().putBoolean("loginStatus", false).apply();
        }
        loginCheck();
    }

内部loginCheck()检查方法将基于登录状态的菜单活动重定向。

public void loginCheck(){
        if(sharedpreferences.getBoolean("loginStatus", true)){
            Intent i = new Intent(this, MainMenuActivity.class);
            startActivity(i);
            this.finish();
        }
    }

如果用户以前没有登录,则在身份验证用户成功地将所需的数据添加到共享的偏好和更改登录状态共享偏好值之后,将发生上述重定向。

if (message.equals("Login successful")) {
                        String employeeId = responseBody.getString("employee_id");
                        int userId = responseBody.getInt("user_id");
                        String employeeName = responseBody.getString("employee_name");
                        SharedPreferencesReference.get().edit().putString("employee_id", employeeId).apply();
                        SharedPreferencesReference.get().edit().putInt("user_id", userId).apply();
                        SharedPreferencesReference.get().edit().putString("employee_name", employeeName).apply();
                        SharedPreferencesReference.get().edit().putBoolean("loginStatus", true).apply();
                        Toasty.success(ActivityWeakReference.get(), message, Toast.LENGTH_SHORT, true).show();
                        Intent i = new Intent(ActivityWeakReference.get(), MainMenuActivity.class);
                        ActivityWeakReference.get().startActivity(i);
                        ActivityWeakReference.get().finish();
                    }

菜单活动

在菜单活动中,您应该有一个注销按钮,该按钮可以通过更改共享偏好登录状态值来注销。就我而言,我将其作为菜单项。

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.logout:
                sharedpreferences.edit().putBoolean("loginStatus", false).apply();
                Intent intent = new Intent(this,MainActivity.class);
                startActivity(intent);
                break;
        }
        return true;
    }

最新更新