SharedPreferences是一种在服务和UI之间共享设置的安全方式吗?

问题描述 投票:0回答:3

SharedPreferences是一种在服务和UI之间共享设置的安全方式吗?

我在服务中调用commit(),当我在300毫秒后读取UI中的prefs时,数据不存在。这是在API 27上。

我已经使用Messenger在服务和UI之间进行通信。

这就是我在服务端存储数据的方式:

  local e = context:getSharedPreferences("characters", context.MODE_PRIVATE):edit()
  e:putString("list", table.concat(names, "|"))
  log("saved these names in characters: %s", tstring(names))
  e:commit()
  local stuff = context:getSharedPreferences("characters", context.MODE_PRIVATE)

在UI中检索它:

  charlist_settings = activity:getSharedPreferences("characters", activity.MODE_PRIVATE)
  log("refreshlist hit")
  if charlist_settings:contains("list") and charlist_settings:getString("list", "") ~= "" then
    [...]
  else
    log("no list in char_settings :(")
    log("all: %s", charlist_settings:getAll():toString())
  end

服务日志,通知时间戳:

12-22 18:56:30.246 4142-4142/org.vadisystems.irehelper:Service I/IRE Helper: modified is: added
12-22 18:56:30.253 4142-4142/org.vadisystems.irehelper:Service I/IRE Helper: saved these names in characters: {"Vadimuses_Achaea"}

UI日志,这是在从服务收到消息之后:

12-22 18:56:30.700 4120-4120/org.vadisystems.irehelper I/IRE Helper: refreshlist hit
12-22 18:56:30.701 4120-4120/org.vadisystems.irehelper I/IRE Helper: no list in char_settings :(
12-22 18:56:30.702 4120-4120/org.vadisystems.irehelper I/IRE Helper: all: {}
android android-service android-gui
3个回答
0
投票

这应该工作,使用基于文档的commit()或apply()。应该在所有进程内线程和组件之间立即显示更改。但是我注意到Android中的错误在过去尝试在服务和活动之间执行此操作。您尝试使用getDefaultSharedPreferences()而不是自定义文件。我使用默认文件没有问题。


0
投票

甚至没有重新启动活动就可以在提交数据后获取数据。唯一能做的就是完全重启应用程序。这是在API 27上。


-1
投票

当动作完成时,使用本地广播接收器进行广播。在监听方面,你有一个负责持久化到SharedPreferences的类,并且UI可以有一个单独的监听器并自行更新。

Sample Kotlin code

[编辑]建议使用apply vs commit作为依赖于内存缓存层的快速解决方法,结果不是由SharedPreferences提供的,我们正在调整此答案以使用本地广播接收器。

© www.soinside.com 2019 - 2024. All rights reserved.