首页 > 解决方案 > 即使重新启动,我的应用程序仍保持登录状态

问题描述

我正在为我的家庭作业项目制作简单的登录应用程序。我希望用户在我的应用程序被销毁后保持登录状态。我做到了,但现在即使没有输入电子邮件和密码,他也总是登录。我希望能够保持登录状态直到他按下注销按钮,但即使他按下它,他也会返回登录页面,但是当应用程序重新启动时,它会再次登录

我试过这个:如何让android应用程序始终处于登录状态?

登录页面:

public class MainActivity extends AppCompatActivity {

    private EditText email, password;
    private SharedPreferences sharedPreferences;
    public static final String PREF_NAME = "sp_name";
    ConstraintLayout constraintLayout;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        email = findViewById(R.id.email_view);
        password = findViewById(R.id.pass_view);
        constraintLayout = findViewById(R.id.activity_main);
        sharedPreferences = getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);

        //        //uzimam email vrednost iz sharedprefernce
        String storedEmail = sharedPreferences.getString("EMAIL", null);

        //uzimam password vrednosti
       String storedPass = sharedPreferences.getString("PASSWORD", null);

        if(storedEmail != null && storedPass != null){
            // login automatically with username and password
           goToPocetnaStranica();
        }
        Button loginButton = findViewById(R.id.login_button);

        //kada je dugme za login stisnuto loguje se na pocetnu stanu i skladisti login informacije
        //u sharedpreference tak da sledeci put moze da se autologuje bez ponovnog unosa login informacija
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //uzimam email i password
                String getEmail = email.getText().toString();
                String getPass = password.getText().toString();

                //proveravam da li je neko polje prazno
                if (TextUtils.isEmpty(getEmail) || TextUtils.isEmpty(getPass)) {
                    Toast.makeText(MainActivity.this, R.string.obavestenje_za_unos, Toast.LENGTH_SHORT).show();
                } else {
                    SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString("EMAIL", getEmail);
                    editor.putString("PASSWORD", getPass);
                    editor.apply();
                    email.setText("");
                    password.setText("");
                    goToPocetnaStranica();

                }
            }
        });

    }
    private void goToPocetnaStranica(){
        Toast.makeText(MainActivity.this, R.string.uspesno_logovanje, Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(MainActivity.this, PocetnaStranica.class);
        startActivity(intent);
    }
}

和我登录后的页面:

public class PocetnaStranica extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pocetna_stranica);
        Button logoutButton = findViewById(R.id.logout_button);
        logoutButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                SharedPreferences.Editor editor = settings.edit();
                editor.remove("PASSWORD");
                editor.clear();
                editor.apply();
                finish();
            }
        });
    }


}

标签: androidsharedpreferences

解决方案


@Sebastian 提出了一个很好的观点,即您需要在 if 语句中使用 AND 运算符而不是 OR 运算符。那是因为它会检查电子邮件是否存在或密码是否存在。您发布的只是删除了密码,因此电子邮件仍然存在。该程序将其视为已登录。此外,无需单独删除密码和电子邮件,只需使用:

sharedPreferences.clear() //Clears every single value

这也有助于删除缓存文件并节省浪费的内存空间。

编辑: 错误实际上是在您的第二段代码中。此代码获取共享首选项:

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

这确实获得了默认的共享首选项,但不是获得您保存电子邮件和密码的首选项,而是返回一组完全不同的共享首选项。你应该做的是:

SharedPreferences pref = getApplicationContext().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);

这与您在 MainActivity.java 中所做的相同,这就是错误:它必须相同。在这里String PREF_NAME = "sp_name";。首选项名称/ID,它们的存在是为了识别共享首选项。

如果您想了解有关共享首选项及其工作原理的更多信息,请查看文档:https ://developer.android.com/reference/android/content/SharedPreferences


推荐阅读