2012-11-09 105 views
1

我想跨进程提供某些信息(比方说状态变量 - 布尔值)。该变量的状态由服务维护,其他应用程序只能读取它(不修改它)。跨进程共享状态变量

我的第一个想法是SharedPreferences,但是有文档说明说明SharedPreferences的使用在多个进程中不受支持。这给我留下了服务消息,AIDL,意图和ContentProvider。

服务消息或AIDL不存在问题,因为它始终有一个异步部分(以及Intents)。我也想到了ContentProvider,但为了这个,它似乎有点夸张/臃肿。写入外部存储将允许其他进程修改数据。

所以,我错过了什么或者我想要完成的事情是不可能的? (或为此推荐)

在此先感谢。

回答

1

服务消息传递或AIDL不存在问题,因为它始终有一个异步部分(以及Intents)。

绑定到基于AIDL的服务是异步的,但是一次预先完成。调用AIDL定义的方法是同步的。

我也想到ContentProvider,但它似乎有点夸张/臃肿只是为了这一点。

你的大部分选择都会被类似地“夸大/臃肿”。

我失去了什么

你可以使用广播Intents推动改变的价值,特别是如果该值不经常改变。这里面临的挑战是引导初始值(例如,应用程序B已安装并需要来自应用程序A的值,但必须等到值改变并且应用程序A发送广播)。然而,如果你会读取很多值,这可能是值得考虑的,因为每次读取IPC可能会增加更多的开销。

另外,您可能希望重新考虑是否有这种依赖性是一个好主意。使用我前一段的命名法,如果App A需要App A维护的某些值,App B或许不能在App A中存在,因为用户可以随时卸载App A,这可能会导致问题。此外,如果此标志是指某种控制机制(例如,请勿在其他应用程序执行Y时执行X操作),那么您将遇到问题,特别是在两个进程可能真正同时运行的多核设备上。

+0

我正在使用AIDL,但绑定是异步的正是我的问题,因为我需要从绑定到它的服务权限后读取值。 关于应用程序A和B;应用B依赖应用A的情况正是我的情况。应用程序A管理服务使用的数据。应用程序B登录到服务中。状态变量(或标志)会像'isSessionActive'布尔类型。 – takecare

+0

@takecare:“我需要在绑定后从服务中读取值” - 然后使用“ContentProvider”,或将这些应用组合到一个应用中。 “应用程序A管理服务使用的数据。应用程序B登录到服务“ - 因为听起来没有其他应用程序是有用的,为什么他们分开的应用程序? – CommonsWare

+0

我必须有单独的应用程序,因为这个想法是提供服务(它有点像客户端 - 服务器模型,作为服务器的服务器,在这种情况下,应用程序B是客户端)。应用程序B是一个示例应用程序,但可能还有更多。 – takecare