gpt4 book ai didi

android - SharedPreferences 不会保存强制关闭应用程序

转载 作者:行者123 更新时间:2023-11-29 15:23:48 30 4
gpt4 key购买 nike

我有一个带有复选框的登录表单,让应用记住 LoginActivity 中的电子邮件。如果我按下登录按钮,电子邮件应该使用类 AppPreferences 存储在 SharedPreferences 中。

如果我通过按主页按钮并按返回键返回主屏幕,该应用程序会记住电子邮件。

但是,如果我强行关闭,应用程序会显示 Preferencemanager.getString("value", "default_value"); 方法中定义的默认值。

我已经尝试了很多人们在 SO 上提出的建议,但不幸的是,没有一个解决方案有效。我什至试图通过将所有 SharedPreferences 代码放在一个单独的类中来解决它(参见 this question)。

下面我放了尽可能多的与问题相关的代码。所以 LoginActivityAppPreferences 这两个类。 LogCat 没有给出错误信息。

在装有 Android 4.2.2 Cyanogenmod 10.1 的三星设备 I9100 和 P3110 以及几个不同的模拟器上都会出现此问题。 (我读到一些带有 HoneyComb 的 Samsung S 设备无法正确保存 SharedPreferences?)


编辑:正如我忘记提及的,该项目针对 API 17 和 minSdkVersion = 11。我只在单击“登录”按钮时保存凭据。
编辑 2:如果手机重启,也会出现此问题


LoginActivity 类:

public class LoginActivity extends Activity
{
private static final String PREF_REMEMBER_EMAIL = "LoginCredentialsRememberEmail";
private static final String PREF_EMAIL = "LoginCredentialsEmail";

private String mEmail;

private EditText mEmailView;
private CheckBox cbRememberEmail;

private AppPreferences appPreferences;

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

appPreferences = new AppPreferences(LoginActivity.this);

loadUserCredentials();
}
@Override
protected void onResume() {
super.onResume();
loadUserCredentials();
}

@Override
protected void onStart() {
super.onStart();
loadUserCredentials();
}

private void loadUserCredentials() {
String rememberEmail = appPreferences.getPreferenceString(PREF_REMEMBER_EMAIL);
String email = appPreferences.getPreferenceString(PREF_EMAIL);
mEmailView = (EditText) findViewById(R.id.email);
mEmailView.setText((rememberEmail == "1") ? email : "");
cbRememberEmail = (CheckBox) findViewById(R.id.cbRememberEmail);
cbRememberEmail.setChecked(rememberEmail == "1" ? true : false);
mEmail = mPassword = "";
}
private void saveUserCredentials() {
try {
String rememberemail = (((CheckBox) findViewById(R.id.cbRememberEmail)).isChecked()) ? "1" : "0";
appPreferences.setPreferenceString(PREF_REMEMBER_EMAIL, rememberemail);
String email = (rememberemail == "1") ? mEmail : "";
appPreferences.setPreferenceString(PREF_EMAIL, email);
}



public void cbRememberEmailClick(View view) {
boolean checked = ((CheckBox) findViewById(R.id.cbRememberEmail)).isChecked();
if (checked) {
new AlertDialog.Builder(this).setTitle(R.string.remember_email_notification_title).setMessage(R.string.remember_email_notification_message).setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
((CheckBox) findViewById(R.id.cbRememberEmail)).setChecked(true);
}
}).setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
((CheckBox) findViewById(R.id.cbRememberEmail)).setChecked(false);
}
}).show();
}
}
// ...
}

AppPreferences 类:

public class AppPreferences {
Context context;

private SharedPreferences settings = null;

private static String LOGIN_CREDENTIALS = "com.example.login.credentials";
private static String DEFAULT_STRING = "";

public AppPreferences(Context context) {
this.context = context;
settings = PreferenceManager.getDefaultSharedPreferences(context);
}

private String getKey(String key) {
return LOGIN_CREDENTIALS + "." + key;
}

public String getPreferenceString(String key) {
return settings.getString(getKey(key), DEFAULT_STRING);
}
public void setPreferenceString(String key, String value) throws Exception {
SharedPreferences.Editor editor = settings.edit();
editor.putString(getKey(key), (String) value);
editor.commit();
}
// ...
}

非常感谢任何帮助,我已经坚持了好几天,现在真的很沮丧。

提前致谢。

敬业

最佳答案

您没有显示调用 saveUserCredentials 的代码。你应该在 onPause 中调用它:

@Override
protected void onPause() {
super.onPause();
saveUserCredentials();
}

如果您在后面的生命周期方法之一(例如 onDestroy)中调用它,如果应用程序在后台强制关闭,则不会调用它。 (如果您只针对 Honeycomb 及更高版本,则可以将其延迟到 onStop。)

关于android - SharedPreferences 不会保存强制关闭应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15297779/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com