Общие настройки сбрасывают данные, когда приложение принудительно закрывается или устройство перезапускается

Я разрабатываю приложение, в котором я SharedPreferences username и password в SharedPreferences . Все отлично работает для меня, сохраняя, а также извлекая значения. Но я обнаружил, что когда я перезапускаю устройство или приложение принудительно закрывается, значение, хранящееся в SharedPreferences , сбрасывается. И когда я снова запускаю свое приложение, я получаю нулевые значения в SharedPreferences . Вот что я делаю для хранения значений:

 SharedPreferences emailLoginSP; emailLoginSP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); emailLoginSP.edit().putString("prefEmailId", email_text).commit(); emailLoginSP.edit().putString("prefUserId", userIDToken).commit(); emailLoginSP.edit().putString("prefAccess_token", accessToken).commit(); Intent i = new Intent(LoginWithEmail.this,UserInfoActivity.class); i.putExtra("acess_token", accessToken); i.putExtra("user_id", userIDToken); i.putExtra("emailID", email_text); startActivity(i); 

И вот как я его извлекаю:

 SharedPreferences emailLoginSP = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); loginEmail = emailLoginSP.getString("prefEmailId", null); loginUserId = emailLoginSP.getString("prefUserId", null); loginAccessToken = emailLoginSP.getString("prefAccess_token", null); 

До сих пор все работает нормально. Снова я заявляю о своей проблеме, что получаю нулевые значения, когда я принудительно закрываю или перезапускаю свое устройство. Можем ли мы сохранить его навсегда в памяти приложения? Или я здесь что-то не так?

Любая помощь будет оценена.

У меня есть экран входа в систему и вы хотите, чтобы приложение отображалось так, как будто оно осталось «вошедшим в систему» ​​на внутреннем экране после закрытия приложения / уничтожения / телефонного звонка / и т. Д.

У меня есть объект Preferences для сохранения значений после Login или Register . Я читаю значения предпочтений во всех ключевых onResume() .

После входа (например):

 SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(activity); SharedPreferences.Editor editor = app_preferences.edit(); editor.putString("sessionId", application.currentSessionId); editor.putString("userId", application.currentUserId); editor.putString("userEmail", application.currentUserEmail); editor.putString("siteUserId", application.currentSiteUserId); editor.commit(); 

Внутри onResume () действий: (то есть внутри внутренних экранов)

 SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(activity); application.currentSessionId = app_preferences.getString("sessionId", ""); application.currentUserId = app_preferences.getString("userId", ""); application.currentUserEmail = app_preferences.getString("userEmail", ""); application.currentSiteUserId = app_preferences.getString("siteUserId", ""); 

Заметка. У меня есть «глобальные» переменные application.currentSessionId , то есть application.currentSessionId , вы можете просто заменить переменные

Попробуйте что-то подобное, возможно, вы не сохраните или не SharePreferences значения правильно, потому что SharePreferences должны работать

Здравствуй ! Решение, которое сработало для меня!

Решение 1 Решение 2

Решение 1:

  SharedPreferences sharedPreferences = getSharedPreferences("namefile", Context.MODE_PRIVATE);//store or retrieved file "namefile.xml". /*or SharedPreferences sharedPreferences =getActivity().getSharedPreferences("namefile", Context.MODE_PRIVATE); (use Shared Preferences in Fragment)*/ String getValueFromKey = sharedPreferences.getString("yourKey",new String()); //Log.d("printf:",getValueFromKey ); getValueFromKey ="Hahaha"; /* Edit value or Do nothing …… */ SharedPreferences.Editor editor = sharedPreferences.edit(); editor.clear(); //[important] Clearing your editor before using it. editor.putString("yourKey", getValueFromKey); editor.commit(); 

Решение 2:

 SharedPreferences sharedPreferences = getSharedPreferences("namefile", Context.MODE_PRIVATE);//store or retrieved file "namefile.xml". /*or SharedPreferences sharedPreferences = getActivity().getSharedPreferences("namefile", Context.MODE_PRIVATE); (use Shared Preferences in Fragment) */ Set getListValueFromKey = sharedPreferences.getStringSet("yourKey",new HashSet()); getListValueFromKey.add("Hahaha"); getListValueFromKey.add("Kakaka"); getListValueFromKey.add("Hohoho"); /* Add value or Do nothing …… */ SharedPreferences.Editor editor = sharedPreferences.edit(); editor.clear(); //[important] Clearing your editor before using it. editor.putStringSet("yourKey", getListValueFromKey); editor.commit(); 

У меня была такая же проблема, как и у вас, и это сработало для меня. Для всего моего примера кода см.

Изменить на:

 SharedPreferences emailLoginSP; SharedPreferences.Editor SPEdit; emailLoginSP = getSharedPreferences("pref_file_name",MODE_PRIVATE); SPEdit = emailLoginSP.edit(); SPEdit.putString("prefEmailId", email_text); SPEdit.putString("prefUserId", userIDToken); SPEdit.putString("prefAccess_token", accessToken); SPEdit.commit(); 

ПРИМЕЧАНИЕ. Это непроверено и из памяти, поэтому может возникнуть ошибка.

Вы хотите минимизировать .commit() , поэтому в конце есть только один.

pref_file_name может быть любым, что вы хотите, с строчными буквами, без цифр при запуске и т. д.

Смотрите, что я сделал, как показано ниже.

  sharedPreferences = PreferenceManager .getDefaultSharedPreferences(getApplicationContext()); editor = sharedPreferences.edit(); isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0); editor.putInt("isPaidVerison", 1); editor.commit(); 

И это прекрасно работает. Данные будут оставаться в Sharedprefrences до тех пор, пока вы не переустановите приложение или пока не очистите данные.

И я извлекаю данные таким образом.

  isPaidVerison = sharedPreferences.getInt("isPaidVerison", 0); 

Если вы хотите попробовать другой подход, кроме общих настроек, вы можете использовать файл для записи значений, а затем извлекать из него значения. Объявите текстовый файл emailLogin.txt и используйте его для записи данных.

  try { Context context = MainActivity.this; OutputStreamWriter out= new OutputStreamWriter(context.openFileOutput(EMAILLOGIN, 0)); out.write(email_text); out.write("\r\n"); out.write(userIDToken); out.write("\r\n"); out.write(accessToken); out.write("\r\n"); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

После записи в файл вы можете сделать следующее, чтобы прочитать его.

  File file = this.getFileStreamPath(EMAILLOGIN); if(file.exists()) { try { InputStream in=openFileInput(NUMBERS); if (in!=null) { InputStreamReader tmp=new InputStreamReader(in); BufferedReader reader=new BufferedReader(tmp); String str; String strcount[]= new String[20]; java.util.Arrays.fill(strcount, 0, 10, ""); while ((str = reader.readLine()) != null) { strcount[linecount]=str; } loginEmail = strcount[0]; loginUserId = strcount[1]; loginAccessToken = strcount[2]; in.close(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

Это гарантирует, что даже когда ваше приложение закроется или перезагрузится устройство, вы все равно можете прочитать требуемые значения из файла.

Убедитесь, что вы используете тот же файл для сохранения и извлечения. Это заставило меня выглядеть действительно немым 🙁

 // When saving public SharedPreferences.Editor getEditor(Activity activity, int mode) { SharedPreferences sharedPref = activity.getApplicationContext().getSharedPreferences(PreferenceConstants.SWAGGER_USER_PREFS, mode); SharedPreferences.Editor editor = sharedPref.edit(); return editor; } // When getting it public SharedPreferences getSharedPref(Activity activity, int mode) { SharedPreferences sharedPref = activity.getSharedPreferences(PreferenceConstants.SWAGGER_USER_PREFS, mode); return sharedPref; } 
  • Android getDefaultSharedPreferences
  • В чем разница между commit () и apply () в общих предпочтениях
  • Невозможно добавить двойные SharedPreferences
  • Давайте будем гением компьютера.