我有一个奇怪的问题,共享首选项在返回应用程序时没有被更新.这是场景:

我有两个项目使用相同的共享首选项. Project1和Project2.它们是独立但相关的应用程序.他们使用相同的密钥进行签名,并使用sharedUserId来共享信息.

Project1打开Project2.

Project2检索SharedPreferences文件并通过以下方式写入:

Context prefsContext = c.createPackageContext(packageNameOfProject1,Context.CONTEXT_IGnorE_Security);
SharedPreferences prefs = prefsContext.getSharedPreferences(fileName,Context.MODE_PRIVATE);
SharedPreferences.editor editor = prefs.edit();
editor.putBool("bool1",value1);
editor.putBool("bool2",value2);
...
editor.putBool("boolN",valueN);
editor.apply();

一旦完成,我通过调用finish()返回到Project1.

Project1然后读取数据如下:

SharedPreferences prefs = getSharedPreferences(getPreferencesFileName(),Context.MODE_PRIVATE);
Boolean value1 = prefs.getBoolean(fileName,false);
Boolean value2 = prefs.getBoolean(fileName,false);
...
Boolean valueN = prefs.getBoolean(fileName,false);
Map<String,?> mappings = prefs.getAll();
Set<String> keys = mappings.keySet();
for(String key : keys) {
  log.d(TAG,"_____");
  log.d(TAG,"Key = " + key);
  log.d(TAG,"Value = " + mappings.get(key));
}

问题是在Project1中没有更新值.我可以告诉基于日志的最后文件甚至不生成映射.但是,我可以验证xml是否正在更新.如果我强制停止应用程序,然后重新启动它,所有的映射都在Project1中.所有的值都是正确的.但是,当用户离开Project2时,我需要更新.我觉得有一些我在这里失踪但不能发现.

我能够找到的唯一的事情是:

SharedPreferences.Editor not being updated after initial commit

SharedPreferences value is not updated

这些没有帮助,因为我已经这样做了.

我在两个清单中都设置了WRITE_EXTERNAL_STORAGE. fileName是一样的(否则当我重新输入应用程序时,我将无法读取该文件).

编辑:

我应该注意到,我试图做editor.commit()而不是editor.apply(),因为我以为我正在面对一个竞争条件.问题依然存在.我在想,由于某些原因,即使我每次都在懒惰加载它,而是使用Project1中的SharedPreference的旧引用而不是新的.

EDIT2:

好的,进一步测试看看什么ID.我决定尝试相反的方向.

在Project1中我做:

Float testFloat (float) Math.random();
Log.d("TEST_FLOAT","Project1: TEST_FLOAT = " + testFloat);
prefs.edit().putFloat("TEST_FLOAT",testFloat).commit();

在Project2中我做:

Log.d("TEST_FLOAT","Project2: TEST_FLOAT = " + prefs.getFloat("TEST_FLOAT",0.0f));

然后我在两者之间来回移动:Project1-> Project2-> Project1-> Project2-> Project1-> Project2,这里是logcat结果:

Project1: TEST_FLOAT = 0.30341884
Project2: TEST_FLOAT = 0.30341884
Project1: TEST_FLOAT = 0.89398974
Project2: TEST_FLOAT = 0.30341884
Project1: TEST_FLOAT = 0.81929415
Project2: TEST_FLOAT = 0.30341884

换句话说,它正在读写同一个文件.但是,当它在项目中首次打开时,它保留了它所具有的映射.即使我关闭了项目,映射仍然保留,直到应用程序被强制停止.

解决方法

最后答案:

更换

getSharedPreferences(fileName,Context.MODE_PRIVATE);

getSharedPreferences(fileName,Context.MODE_MULTI_PROCESS);

根据文件:

Context.MODE_MULTI_PROCESS

SharedPreferences loading flag: when set,the file on disk will be
checked for modification even if the shared preferences instance is
already loaded in this process. This behavior is sometimes desired in
cases where the application has multiple processes,all writing to the
same SharedPreferences file. Generally there are better forms of
communication between processes,though.

This was the legacy (but undocumented) behavior in and before
Gingerbread (Android 2.3) and this flag is implied when targeting
such releases. For applications targeting SDK versions greater than
Android 2.3(Gingerbread),this flag must be explicitly set if desired.

我知道这里有一个简单的监督.

android – SharedPrefences未更新的更多相关文章

  1. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. Canvas图片分割效果的实现

    这篇文章主要介绍了Canvas图片分割效果的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5 Canvas实现放大镜效果示例

    这篇文章主要介绍了HTML5 Canvas实现放大镜效果示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)

    这篇文章主要介绍了Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. html5如何在Canvas中实现自定义路径动画示例

    本篇文章主要介绍了html5如何在Canvas中实现自定义路径动画示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. canvas实现圆形进度条动画的示例代码

    这篇文章主要介绍了canvas实现圆形进度条动画的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. HTML5仿微信聊天界面、微信朋友圈实例代码

    小编最近开发一个基于html5开发的一个微信聊天前端界面,功能很全面,下面小编给大家分享实例代码,需要的朋友参考下

  8. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. 手把手教你实现一个canvas智绘画板的方法

    这篇文章主要介绍了手把手教你实现一个canvas智绘画板的方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. 使用canvas来完成线性渐变和径向渐变的功能的方法示例

    这篇文章主要介绍了使用canvas来完成线性渐变和径向渐变的功能的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. bluetooth-lowenergy – Altbeacon库无法在Android 5.0上运行

    昨天我在Nexus4上获得了Android5.0的更新,并且altbeacon库停止了检测信标.似乎在监视和测距时,didEnterRegion和didRangeBeaconsInRegion都没有被调用.即使RadiusNetworks的Locate应用程序现在表现不同,一旦检测到信标的值,它们就不再得到更新,并且通常看起来好像信标超出了范围.我注意到的一点是,现在在logcat中出现以下行“B

  2. android – react-native动态更改响应者

    我正在使用react-native进行Android开发.我有一个视图,如果用户长按,我想显示一个可以拖动的动画视图.我可以使用PanResponder实现这一点,它工作正常.但我想要做的是当用户长按时,用户应该能够继续相同的触摸/按下并拖动新显示的Animated.View.如果您熟悉Google云端硬盘应用,则它具有类似的功能.当用户长按列表中的任何项目时,它会显示可拖动的项目.用户可以直接拖

  3. android – 是否有可能通过使用与最初使用的证书不同的证书对其进行签名来发布更新的应用程序

    是否可以通过使用与最初使用的证书不同的证书进行签名来发布Android应用程序的更新?我知道当我们尝试将这样的构建上传到市场时,它通常会给出错误消息.但有没有任何出路,比如将其标记为主要版本,指定市场中的某个地方?解决方法不,你不能这样做.证书是一种工具,可确保您是首次上传应用程序的人.所以总是备份密钥库!

  4. 如何检测Android中是否存在麦克风?

    ..所以我想在让用户访问语音输入功能之前检测麦克风是否存在.如何检测设备上是否有麦克风.谢谢.解决方法AndroidAPI参考:hasSystemFeature

  5. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

  6. android – 获得一首歌的流派

    我如何阅读与歌曲相关的流派?我可以读这首歌,但是如何抓住这首歌的流派,它存放在哪里?解决方法检查此代码:

  7. android – 使用textShadow折叠工具栏

    我有一个折叠工具栏的问题,在展开状态我想在文本下面有一个模糊的阴影,我使用这段代码:用:我可以更改textColor,它可以工作,但阴影不起作用.我为阴影尝试了很多不同的值.是否可以为折叠文本投射阴影?

  8. android – 重用arm共享库

    我已经建立了armarm共享库.我有兴趣重用一个函数.我想调用该函数并获得返回值.有可能做这样的事吗?我没有任何头文件.我试过这个Android.mk,我把libtest.so放在/jni和/libs/armeabi,/lib/armeabi中.此时我的cpp文件编译,但现在是什么?我从objdump知道它的名字编辑:我试图用这个android.mk从hello-jni示例中添加prebuild库:它工作,但libtest.so相同的代码显示以下错误(启动时)libtest.so存在于libhello-j

  9. android – 为NumberPicker捕获键盘’Done’

    我有一个AlertDialog只有一些文本,一个NumberPicker,一个OK和一个取消.(我知道,这个对话框还没有做它应该保留暂停和恢复状态的事情.)我想在软键盘或其他IME上执行“完成”操作来关闭对话框,就像按下了“OK”一样,因为只有一个小部件可以编辑.看起来处理IME“Done”的最佳方法通常是在TextView上使用setonEditorActionListener.但我没有任何Te

  10. android – 想要在调用WebChromeClient#onCreateWindow时知道目标URL

    当我点击一个带有target=“_blank”属性的超链接时,会调用WebChromeClient#onCreateWindow,但我找不到新的窗口将打开的新方法?主页url是我唯一能知道的东西?我想根据目标网址更改应用行为.任何帮助表示赞赏,谢谢!

返回
顶部