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

时间:2013-03-08 15:42:59

标签: android save sharedpreferences

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

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

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

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

下面我列出了与问题相关的代码。所以课程LoginActivityAppPreferences都是如此。 LogCat没有给出错误消息。

在使用Android 4.2.2 Cyanogenmod 10.1的三星设备I9100和P3110以及几种不同的仿真器上都会出现此问题。 (我看了一些使用HoneyComb的三星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();
    }
// ...
}

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

提前致谢。

Dediqated

4 个答案:

答案 0 :(得分:3)

您不会显示调用saveUserCredentials的代码。你应该在onPause

中调用它
@Override
protected void onPause() {
    super.onPause();
    saveUserCredentials();
}

如果您使用其中一个后续生命周期方法(例如onDestroy)调用它,则在后台强制关闭应用时,将不会调用它。 (如果您仅定位Honeycomb及更高版本,则可以将此推迟到onStop。)

答案 1 :(得分:1)

我建议你将save方法放入onDestroy方法

答案 2 :(得分:1)

我通过将字段rememberEmail更改为Boolean而非包含10的字符串来修复此问题。我不知道为什么这不起作用,但我更高兴的是,经过11天的挫折之后,这已不再是问题了。

我也删除了文件夹/data/data/com.example/shared_prefs/

中的所有偏好文件

更改了LoginActivity

中的代码
// ....
private void loadUserCredentials() {
    Boolean rememberEmail = appPreferences.getPreferenceBoolean(PREF_REMEMBER_EMAIL);
    String email = appPreferences.getPreferenceString(PREF_EMAIL);
    mEmailView = (EditText) findViewById(R.id.email);
    mEmailView.setText(rememberEmail ? email : "");
    cbRememberEmail = (CheckBox) findViewById(R.id.cbRememberEmail);
    cbRememberEmail.setChecked(rememberEmail);
}
private void saveUserCredentials() {        
    try {
    Boolean rememberEmail = ((CheckBox) findViewById(R.id.cbRememberEmail)).isChecked();
    appPreferences.setPreferenceBoolean(PREF_REMEMBER_EMAIL, rememberEmail);
    String email = (rememberEmail) ? mEmail : "";
    appPreferences.setPreferenceString(PREF_EMAIL, email);
}
// ....

并在AppPreferences

// ....
private String getKey(String key) {
    key = key.toLowerCase();
    return LOGIN_CREDENTIALS + "." + key;
}
// newly added methods below
public String getPreferenceBoolean(String key) {
    return settings.getBoolean(getKey(key), DEFAULT_BOOLEAN);
}
public void setPreferenceBoolean(String key, Boolean value) throws Exception {
    SharedPreferences.Editor editor = settings.edit();
    editor.putBoolean(getKey(key), (Boolean) value);
    editor.commit();
}
// ....

我希望你不会像我那样犯同样的错误;)

答案 3 :(得分:0)

如果您在选中复选框时调用saveUserCredentials();,那么这应该可以正常工作。也可以尝试在应用程序启动时初始化首选项obj