即使重启,我的应用仍保持登录状态

时间:2019-07-27 13:36:12

标签: android sharedpreferences

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

我尝试过:How to keep android applications always be logged in state?

登录页面

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();
            }
        });
    }


}

2 个答案:

答案 0 :(得分:2)

@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

答案 1 :(得分:0)

似乎在您的主要活动中,当使用OR(||)运算符时,它应该是AND(&&)。

别忘了还要从首选项中删除电子邮件。