Sharedpreference byte valor eliminado después de que la aplicación se haya eliminado mediante 'Force Stop' o el administrador de tareas

Problema

Estoy guardando un byte[] en mis preferencias compartidas. Puedo cerrar la aplicación y volver a abrirla con el valor que persiste en las Preferencias compartidas. Al ejecutar la aplicación y cerrarla a través del "Administrador de tareas" o "Cerrar la fuerza", se elimina el valor de preferencia compartida para el byte[] . No entiendo esto porque otros valores persisten bien.

Esto me lleva a creer que esto se debió a algún problema de gson o Shared Preference con el byte[] así que lo convertí en una String y todavía tengo el problema.

Editar:
Ahorro los datos durante el uso normal de la actividad … después de onCreate() , por ejemplo. No es durante onPuse() o onDestroy() me olvidé de mencionar esto. Tendría sentido si lo llamara aquí y uno o ambos no fueran llamados en el escenario 'Fuerza cerrada'.


Código de preferencia compartido

Se ha modificado ligeramente para eliminar la implementación y los datos específicos de la aplicación

 private static final String SHARED_PREFERENCES_FILE_NAME = "SharedPreferenceName"; public static void setSharedPreferenceObjectBase64Encoded(Context context, String key, Object object) throws Exception { // Need an editor to update shared preference values SharedPreferences.Editor editor = context.getSharedPreferences(SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE).edit(); Gson gson = new GsonBuilder().serializeNulls().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create(); String encodedKey = Base64.encodeToString(key.getBytes(), 0, key.getBytes().length, Base64.DEFAULT); String stringObject = gson.toJson(object); String encodedObject = Base64.encodeToString(stringObject.getBytes(), 0, stringObject.getBytes().length, Base64.DEFAULT); editor.putString(encodedKey, encodedObject); editor.apply(); } public static Object getSharedPreferenceObjectBase64Encoded(Context context, String key, Class<? extends Serializable> objectClass) throws Exception { // Need an editor to update shared preference values SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_FILE_NAME, Context.MODE_PRIVATE); Gson gson = new GsonBuilder().serializeNulls().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create(); String encodedKey = Base64.encodeToString(key.getBytes(), 0, key.getBytes().length, Base64.DEFAULT); String encodedObject = prefs.getString(encodedKey, null); if (encodedObject == null) { throw new NullPointerException("encodedObject is null : No shared preference exists for key."); } String decodedObject = new String(Base64.decode(encodedObject, Base64.DEFAULT)); if(decodedObject == null){ throw new NullPointerException("decodedObject is null : Json decoding error."); } Object resultObject = gson.fromJson(decodedObject, objectClass); if (resultObject == null) { throw new NullPointerException("resultObject is null : Json decoding error."); } return resultObject; } 

`Byte []` Código

 public static final String VALUE_KEY= "value.key"; public static void saveTheValue(Context context, byte[] encryptedPin) { try { USharedPreferenceManager.setSharedPreferenceObjectBase64Encoded(context, VALUE_KEY, encryptedPin); } catch (Exception e) { } } public static byte[] getTheValue(Context context) { try { return (byte[]) USharedPreferenceManager.getSharedPreferenceObjectBase64Encoded(context, VALUE_KEY, byte[].class); } catch (Exception e) { return null; } } 

Cualquier contribución será muy apreciada..

Lamentablemente, no he podido hacer ningún progreso aquí. ¿Alguna idea?


Actualizar:

De acuerdo con la recomendación Super-califragilista, iteré a través de los pares clave / valor en SharedPreferences inmediatamente antes de recuperar el valor. Estaba codificando Base64 mis valores de clave y valor; Con el fin de leer la clave para asegurar el valor estaba en SharedPreferences tuve que usar las teclas en texto plano. Esto resolvió el problema para mí como el valor del byte[] ahora estaba siendo recuperado correctamente.

Esto me parece extraño, pero puedo usarlo como una solución. Todavía me gustaría Base64 codificar las claves, pero no es increíblemente importante.


Solución actual:

Se ha eliminado la codificación Base64 de la clave SharedPreference para el almacenamiento y la recuperación y el valor persiste en todos los casos.

Esta línea de código String encodedObject = prefs.getString(encodedKey, null); Significa que si la clave no existe debe devolver null, por lo tanto la clave que está comprobando no existe.

Para validar si su clave / valor existe, use este código

 for(Entry<String, ?> en : sharedPref.getAll().entrySet()){ en.getKey();//key en.getValue();//value } 

onPause() evitar que suceda el override onPause() en la Activity o el Fragment y llama a saveTheValue(Context context, byte[] encryptedPin) si detecta que necesita guardar datos o ya ha intentado guardar datos eg.

 private boolean forceSaveInOnPause= false;//global variable //in your saving method ....//after you save forceSaveInOnPause = true; //in your onPause of Activity if(forceSaveInOnPause){ //re-save forceSaveInOnPause = false; 

Pero ya que ya tiene una solución de cero todo eso 🙂

Pruebe una vez con editor.commit( ) en lugar de apply() , ver si funciona

Creo que usar Base64.NO_PADDING en lugar de Base64.DEFAULT tanto durante la lectura como la escritura puede resolver el problema.

  • PreferenciaNo se encuentra la clase Screen
  • Uso del editor de preferencias compartidas
  • Borrar el archivo SharedPreferences
  • Cómo almacenar Hashmap en Android para que se reutilice cuando la aplicación se reinicie con las preferencias compartidas?
  • ¿Cómo forzar a PreferenceActivity a manejar mis SharedPreferences?
  • Un botón con el comentario que ya ha hecho clic no se mostrará la próxima vez que el usuario abra la aplicación
  • Mantener más de un archivo de preferencias compartidas en android
  • La mejor opción para almacenar nombre de usuario y contraseña en la aplicación Android
  • ¿La reinstalación de la aplicación suprime SQLiteDatabase o SharedPreferences?
  • SharedPreference cometido en SyncAdapter no actualizado en Activity?
  • SharedPreferences lee valores antiguos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.