通过'Force Stop'或任务管理器

时间:2016-08-05 15:56:48

标签: android gson sharedpreferences

问题

我在共享偏好设置中保存byte[]。我可以关闭应用程序并使用共享首选项中持久保存的值重新打开它。运行应用程序并通过“任务管理器”或“强制关闭”关闭它时,将清除byte[]的共享首选项值。我不明白这一点,因为其他价值观仍然存在。

这让我相信这是由于byte[]的某些gson或共享首选项问题,所以我把它转换为字符串,我仍然有问题。

编辑:
我在正常活动使用期间保存数据...例如onCreate()之后。它不是在onPuse()onDestroy()期间我忘记提及这一点。如果我在这里调用它并且在“强制关闭”场景中没有调用其中一个或两个,那将是有意义的。

共享首选项代码

稍微修改以删除应用特定的实施和数据

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 []`Code

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

任何输入都将非常感谢..

可悲的是,我在这里没有取得任何进展。有什么想法吗?

更新

根据Super-califragilistic建议,我在检索值之前立即迭代SharedPreferences中的键/值对。我是Base64编码我的键值和值;为了读取密钥以确保值在SharedPreferences中,我必须使用纯文本中的密钥。这解决了我的问题,因为现在正在正确检索byte[]值。

这对我来说很奇怪,但我可以用它作为解决方案。我仍然希望Base64对密钥进行编码,但这并不是非常重要。

当前解决方案:

删除了SharedPreference Key的Base64编码以进行存储和检索,现在值仍然存在。

3 个答案:

答案 0 :(得分:3)

这行代码String encodedObject = prefs.getString(encodedKey, null);表示如果不存在,则应返回null,因此您检查的密钥不存在。

验证您的密钥/值是否存在使用此代码

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

您可以阻止overrideonPause()中的Activity Fragment发生这种情况,如果您发现需要保存数据,则可以致电saveTheValue(Context context, byte[] encryptedPin)尝试保存数据,例如。

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;

但是因为你已经有了解决方案,所以:)

答案 1 :(得分:1)

尝试使用editor.commit(代替 apply(),看看是否有效

答案 2 :(得分:0)

I think using Base64.NO_PADDING instead of Base64.DEFAULT both while reading and writing may solve the problem.