2013-03-08 2 views
1

У меня есть форма для входа с флажком, чтобы приложение могло запомнить письмо в LoginActivity. Если я нажму кнопку «Вход», электронное письмо должно быть сохранено в SharedPreferences, используя класс AppPreferences.SharedPreferences не сохраняет силу закрыть приложение

Приложение запоминает письмо, если я вернусь на главный экран, нажав кнопку «домой» и нажав клавишу «назад».

Но если я принудительно закрываю приложение, отображается значение по умолчанию, определенное в методе Preferencemanager.getString("value", "default_value");.

Я пробовал много вещей, которые люди предлагали на SO, но, к сожалению, ни одно из решений не работало. Я даже пытался его решить, поставив все код SharedPreferences в отдельный класс (см. this question).

Ниже я поставил столько же кода, что и вопрос. Таким образом, оба класса LoginActivity и AppPreferences. Сообщение об ошибке отсутствует в LogCat.

На обоих устройствах Samsung I9100 и P3110 с Android 4.2.2 Cyanogenmod 10.1 и нескольких разных эмуляторах возникает эта проблема. (Я прочитал некоторые Samsung S устройств с Honeycomb could't сохранить SharedPreferences правильно?)


EDIT: Как я забыл упомянуть, что проект нацелен на API 17 и minSdkVersion = 11. Только я сохранить учетные данные при нажатии кнопки «Вход».
EDIT 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

ответ

1

я установил ее, изменив поле rememberEmail к Boolean вместо того, чтобы строка, содержащая 1 или 0. Я не знаю, почему это не сработало, но я счастлив в том, что после 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(); 
} 
// .... 

Я надеюсь, вы не будете делать ту же ошибку как я сделал;)

1

Я рекомендую вам, поставив метод сохранения в метод OnDestroy

+2

'onDestroy' не будет t, когда фоновое приложение закрыто принудительно. –

+0

Я только хочу сохранить учетные данные при нажатии кнопки входа в систему – Dediqated

3

Вы не показываете код, который вызывает saveUserCredentials. Вы должны назвать его в :

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

Если вы вызываете его в одном из более поздних методов жизненного цикла (например, onDestroy), он не будет вызываться, если приложение принудительно закрыты, а в фоновом режиме. (Вы можете отложить это до onStop, если вы нацеливаетесь только на сотовые и более поздние версии.)

+3

Возможно, я ошибаюсь, но если вы закроете приложение, то onPause или OnDestory не будут выполняться, так как он полностью убивает процесс, а выполнение какого-либо кода не выполняется – Boardy

+1

@Boardy - Если вы принудительно закрываете приложение переднего плана, то вы не можете сделать это, чтобы гарантировать сохранение данных. (Вы можете принудительно закрыть приложение переднего плана, используя adb, но трудно понять, как вы можете это сделать на самом устройстве.) Если активность не находится на переднем плане, тогда будет вызываться метод 'onPause' (и звонок завершен). Это вызовы 'onStop' (pre-Honeycomb) и' onDestroy', которые пропускаются с близкой силой. –

+0

спасибо за ваш ввод, но, как я уже упоминал, я сохраняю адрес электронной почты, только если нажата кнопка входа в систему. Извините, что я забыл «saveUserCredentials», этот метод вызывается в 'cbRememberEmailClick'. Цель - API 17 (Honeycomb) и minSdkVersion = 11 – Dediqated

0

Если вы звоните в saveUserCredentials(); когда-либо установленный флажок, это должно работать отлично.Также попытайтесь инициализировать предпочтения OBJ при запуске приложения

+0

Я вызываю 'saveUserCredentials()' всякий раз, когда нажимается кнопка входа в систему, мне кажется более логичным. Однако, если я принудительно закрываю приложение или перезапускаю устройство, ничего не сохраняется. – Dediqated

Смежные вопросы