应用程序通过“强制停止”或任务管理器被杀死后,android – Sharedpreference byte []值被清除

应用程序通过“强制停止”或任务管理器被杀死后,android – Sharedpreference byte []值被清除,第1张

概述问题 我在我的共享首选项中保存了一个字节[].我可以关闭该应用程序,并重新打开它,并保持共享首选项中的值.当运行应用程序并通过“任务管理器”或“强制关闭”关闭它时,字节[]的共享首选项值被清除.我不明白这一点,因为其他价值观仍然很好. 这导致我相信这是由于某些gson或共享偏好问题与字节[],所以我将其转换为字符串,我仍然有问题. 编辑: 例如,在onCreate()之后,在正常活动使用期间保存数 问题

我在我的共享首选项中保存了一个字节[].我可以关闭该应用程序,并重新打开它,并保持共享首选项中的值.当运行应用程序并通过“任务管理器”或“强制关闭”关闭它时,字节[]的共享首选项值被清除.我不明白这一点,因为其他价值观仍然很好.

这导致我相信这是由于某些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(),key.getBytes().length,Base64.DEFAulT);        String stringObject = gson.toJson(object);        String encodedobject = Base64.encodetoString(stringObject.getBytes(),stringObject.getBytes().length,Base64.DEFAulT);        editor.putString(encodedKey,encodedobject);        editor.apply();    }    public static Object getSharedPreferenceObjectBase64Encoded(Context context,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(),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 []`代码

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,byte[].class);        } catch (Exception e) {            return null;        }    }

任何投入都将不胜感激

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

更新:

根据超级加速推荐,我在检索该值之前立即遍历SharedPreferences中的键/值对.我是Base64编码我的键值和值值;为了读取密钥以确保在SharedPreferences中的值,我不得不使用纯文本中的键.这解决了我的问题,因为byte []值正在正确检索.

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

当前解决方案:

删除了用于存储和检索的SharedPreference Key的Base64编码,并且在所有情况下,值仍然存在.

解决方法 这行代码String encodedobject = prefs.getString(encodedKey,null);意味着如果密钥不存在,它应该返回null,因此您正在检查的密钥不存在.

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

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

你可以阻止它在Activity或Fragment中重写onPause(),并调用saveTheValue(Context context,byte [] encryptedPin),如果你检测到你需要保存数据或已经尝试保存数据,例如.

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

但是因为你已经有一个解决方案,所有这一切:)

总结

以上是内存溢出为你收集整理的应用程序通过“强制停止”或任务管理器被杀死后,android – Sharedpreference byte []值被清除全部内容,希望文章能够帮你解决应用程序通过“强制停止”或任务管理器被杀死后,android – Sharedpreference byte []值被清除所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1132176.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存