Las preferencias compartidas restablecen datos cuando la aplicación se cierra forzadamente o se reinicia el dispositivo

Estoy desarrollando una aplicación en la que estoy almacenando username y password en SharedPreferences . Todo funciona bien para mí, almacenando y recuperando los valores. Pero descubrí que cuando reinicio el dispositivo o la aplicación se cierra SharedPreferences se restablece el valor almacenado en SharedPreferences . Y cuando vuelvo a lanzar mi aplicación, obtengo valores nulos en la clave SharedPreferences . Aquí, es lo que estoy haciendo para almacenar los valores:

 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); 

Y así es como lo estoy recuperando:

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

Todas las cosas están funcionando bien hasta ahora. Una vez más, estoy declarando mi problema de que obtengo valores nulos cuando fuerzo el cierre o reinicio mi dispositivo. ¿Podemos almacenarlo permanentemente en la memoria de la aplicación? O bien, estoy haciendo algo mal aquí?

Cualquier ayuda será apreciada.

Tengo una pantalla de inicio de sesión y quería que la aplicación apareciera como si hubiera “iniciado sesión” en la pantalla interna después de que la aplicación se cerró / destruyó / llamada telefónica / etc.

Tengo un Objeto de Preferences para guardar valores luego de Login o Register . Leo los valores de preferencia en todos los métodos de la pantalla clave onResume() .

Después de iniciar sesión (por ejemplo):

 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(); 

En onResume () de Actividades: (es decir, dentro de pantallas internas)

 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", ""); 

Nota. Tengo variables de aplicación “globales”, es decir, application.currentSessionId , puedes simplemente sustituir tus variables

Intente algo similar tal vez no guarde o recupere los valores correctamente porque SharePreferences debería funcionar

Hola ! ¡Solución que funcionó para mí!

Solución 1 Solución 2

Solución 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(); 

Solución 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(); 

He tenido exactamente el mismo problema que el tuyo y esto funcionó para mí. Para ver todo el código, vea

Cambiar a:

 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(); 

NOTA: Esto no se ha probado y de la memoria, por lo que puede haber un error.

Desea minimizar las llamadas de .commit() , por lo que solo hay una al final.

pref_file_name puede ser lo que quieras, con letras minúsculas, sin números al inicio, etc.

Mira, lo he hecho a continuación.

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

Y esto funciona bien Los datos permanecerán en Sharedprefrences hasta que no reinstalen la aplicación o hasta que no se borren los datos.

Y recupero datos de esta manera.

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

Si desea probar un enfoque diferente a las preferencias compartidas, puede usar un archivo para escribir los valores y luego recuperar los valores. Declare un archivo de texto emailLogin.txt y úselo de la siguiente manera para escribir los datos.

  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(); } 

Después de escribir en el archivo, puede hacer lo siguiente para leer de él.

  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(); } } 

Esto asegurará que incluso cuando se cierre la fuerza de su aplicación o si su dispositivo se reinicie, aún puede leer los valores requeridos del archivo.

Asegúrese de estar utilizando el mismo archivo para guardar y recuperar. Esto me hizo ver realmente tonto 🙁

 // 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; }