跨进程共享状态变量
Posted
技术标签:
【中文标题】跨进程共享状态变量【英文标题】:Sharing state variable across processes 【发布时间】:2012-11-09 15:55:24 【问题描述】:我想跨进程提供某些信息(比如说一个状态变量 - 一个布尔值)。该变量的状态由服务维护,其他应用只能读取(不能修改)。
我的第一个想法是 SharedPreferences,但文档中有一条注释指出,多个进程不支持 SharedPreferences 的使用。剩下的就是服务消息传递、AIDL、意图和 ContentProvider。
服务消息传递或 AIDL 是不可能的,因为它总是有一个异步部分(以及 Intents)。我也想到了 ContentProvider ,但这似乎有点夸张/臃肿。写入外部存储将允许其他进程修改数据。
那么,我是否遗漏了什么,或者我想要完成的事情真的不可能? (或为此推荐)
提前致谢。
【问题讨论】:
【参考方案1】:服务消息传递或 AIDL 是不可能的,因为它总是有一个异步部分(以及 Intents)。
绑定到基于 AIDL 的服务是异步的,但这是预先完成的。调用 AIDL 定义的方法是同步的。
我也想到了 ContentProvider,但这似乎有点夸张/臃肿。
您的大多数选择将类似地“为此而夸大/臃肿”。
我错过了什么
您可以使用广播Intents
来推送对值的更改,尤其是在值不经常更改的情况下。这里的挑战是引导初始值(例如,应用 B 已安装并需要来自应用 A 的值,但必须等到值更改并且应用 A 发送广播)。但是,如果您要大量读取该值,这可能值得考虑,因为每次读取执行一次 IPC 可能会增加超出其价值的开销。
此外,您可能希望重新考虑拥有这种依赖关系是否是一个好主意。使用我前面段落中的命名法,如果 App B 需要 App A 维护的一些价值,App B 可能没有 App A 就无法存在。由于用户可以随时卸载 App A,这可能会导致问题。此外,如果此标志是某种控制机制(例如,请不要在其他应用程序执行 Y 时执行 X),您将遇到问题,尤其是在两个进程可能真正同时运行的多核设备上.
【讨论】:
我正在使用 AIDL,但异步绑定正是我的问题,因为我需要在绑定后立即从服务中读取一个值。关于应用 A 和 B; App B 依赖 App A 的情况正是我的情况。应用 A 管理服务使用的数据。应用 B 登录服务。状态变量(或标志)类似于“isSessionActive”布尔值。 @takecare:“我需要在绑定到服务后立即从服务中读取一个值”——然后使用ContentProvider
,或者将应用程序组合成一个应用程序。 “应用程序 A 管理服务使用的数据。应用程序 B 登录服务”——因为听起来没有另一个应用程序没有另一个应用程序是有用的,为什么它们是独立的应用程序?
我必须有单独的应用程序,因为这个想法是提供服务(它有点像客户端-服务器模型,作为服务器的服务,在这种情况下,应用程序 B 是客户端)。应用 B 是一个示例应用,但可能还有更多。以上是关于跨进程共享状态变量的主要内容,如果未能解决你的问题,请参考以下文章