如何在登录和注销时使用 SharedPreferences 控制存储用户数据?

How to control storing user data using SharedPreferences when logging in and out?

我正在尝试创建一个使用用户名和密码登录的应用程序,然后只要用户没有注销 - 或者当然没有删除应用程序数据 - 就可以保持登录状态,据我所知知道 SharedPreferences 是最好的选择。如何正确实施?

我尝试创建 SharedPreferences 对象然后创建 Editor 对象以在启动应用程序时检查是否存储了用户名和密码的数据,如果是则自动登录。然后注销,单击注销按钮后,用户名和密码密钥将从 SharedPreferences 中删除。但我不确定,我想我做错了,所以应用程序无法运行。

这是我想要做的一个简单示例(假设所有 XML 文件和 ID 都是正确的,因为应用程序在添加 SharedPreferences 之前运行良好):

LoginActivity.java:

public class LoginActivity extends AppCompatActivity {
    private Button button_login;
    private EditText editText_username;
    private EditText editText_password;
    private SharedPreferences pref;

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

        perf = getApplicationContext().getSharedPreferences("user_pref", 0);
        SharedPreferences.Editor editor = perf.edit();
        if(!(sharedPref.getString("username", null)).isEmpty() && !(sharedPref.getString("password", null)).isEmpty()){
            doLogin(sharedPref.getString("username", null), sharedPref.getString("password", null));
        }

        //define editText_username, editText_password and button_login
        button_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!TextUtils.isEmpty(editText_username.getText()) && !TextUtils.isEmpty(editText_password.getText())){
                    doLogin(editText_username.getText().toString().trim(), editText_password.getText().toString().trim());
                }
            }
        });
    }


    public void doLogin(String username, String password) {

        Intent loginIntent = new Intent(LoginActivity.this, HomeActivity.class);
        SharedPreferences.Editor editor = perf.edit();
        editor.putString("username", username);
        editor.putString("password", password);
        startActivity(loginIntent);
                        finish();
    }

}

HomeActivity.java:

public class HomeActivity extends AppCompatActivity {
    private SharedPreferences perf;
    private Button button_logout;

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

        perf = getApplicationContext().getSharedPreferences("user_pref", 0);


        //button_logout define
        button_logout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor = perf.edit();
                editor.remove("username");
                editor.remove("password");
                Intent logoutIntent = new Intent(HomeActivity.this, LoginActivity.this);
                startActivity(logoutIntent);
                finish();
            }
        });
}

我没有得到任何结果,它崩溃了。所以我不确定我做的对不对。

创建 AppPreference class :-

public class AppPrefrences {

    private static SharedPreferences mPrefs;
    private static SharedPreferences.Editor mPrefsEditor;

    public static boolean isUserLoggedOut(Context ctx) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        return mPrefs.getBoolean("id_logged_in", true);
    }

    public static void setUserLoggedOut(Context ctx, Boolean value) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.putBoolean("id_logged_in", value);
        mPrefsEditor.commit();
    }

    public static String getUserName(Context ctx) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        return mPrefs.getString("name", "");
    }

    public static void setUserName(Context ctx, String value) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.putString("name", value);
        mPrefsEditor.commit();
    }
}

现在在 AppPreference 中设置详细信息 Class:-

AppPreference.setUserLoggedOut(this, false);
AppPreference.setUserName(this, "pass username here");

并像这样获取用户名:-

AppPreference.getUserName(this);

或在初始屏幕上检查用户是否已登录:-

if (isUserLoggedOut(StartActivity.this)) {
                    //user not logged in
                } else {
                   //User is logged in
                }

你所做的都是对的,只是你没有承诺你的价值观。

所以你的函数看起来像这样

public void doLogin(String username, String password) {

        Intent loginIntent = new Intent(LoginActivity.this, HomeActivity.class);
        SharedPreferences.Editor editor = perf.edit();
        editor.putString("username", username);
        editor.putString("password", password);
        editor.apply(); //This line will make necessary changes in SharedPreferences file
        startActivity(loginIntent);
        finish();
    }

button_logout 单击

添加同一行

此外,我会建议您为 SharedPreference 操作创建一个实用程序 class。

您必须提交或应用在编辑器中所做的更改。 所以在

之后
        editor.putString("username", username);
        editor.putString("password", password);
        editor.apply(); // or editor.commit()