Android共享服务?

时间:2011-06-01 16:24:16

标签: java android service

首先,我想说两件事。第一个是,对不起,如果已经问过这个问题,我已经围绕这个主题搜索了类似的问题,但无法找到解决方案。对于冗长的问题,对不起,请告诉我任何错误,我一定会做出适当的修改:)。

我对Android开发相对较新(大约2个月),所以请原谅我的无知。我的问题是关于android服务。

我的问题如下,我创建了以下3个应用程序:

  • 一个包含小型测试服务( myService )的安卓库。
  • 可以访问Android库的应用程序( TestApplicationOne )。
  • 另一个也可以访问android库的应用程序( TestApplicationTwo )。

我当前的解决方案如下工作, TestApplicationOne 引用自定义库并使用此库通过 bindService()<连接到服务( myService ) / em>方法。连接成功后,应用程序会将自己添加到位于 myService 中的观察者集合。每次服务需要广播消息时,都会通知此集合中的每个对象。

运行时,上述解决方案似乎运行正常。但是,我现在有另一个应用程序( TestApplicationTwo ),它也想使用与上面相同的服务。 TestApplicationTwo 的实现是针对第一个应用程序( TestApplicationOne )的相同工作/规范创建的。

我遇到的问题是,当在任一应用程序中启动服务时,其他应用程序不会收到任何事件的通知。

我尝试过几种方法来解决这个问题。比如使用Singleton模式来保留单个实例,但问题似乎仍然存在。我唯一能理解的是,每次启动应用程序时,都会创建一个新的库实例。因此, TestApplicationOne 中引用的库与 TestApplicationTwo 中引用的库不是同一个实例,因此未被通知。

有没有人在这个问题上有经验?或者可以考虑任何可能的解决方案?

感谢您提前获得任何帮助,非常感谢。

约翰

2 个答案:

答案 0 :(得分:10)

  

我遇到的问题是,当在任一应用程序中启动服务时,其他应用程序不会收到任何事件的通知。

那是因为你有两项服务。仅仅因为该服务打包在Android库项目中,并不会以某种方式神奇地导致两个不同的应用程序使用相同的副本。

  

比如使用Singleton模式来保留单个实例,但问题似乎仍然存在。

这两个应用程序都在不同的进程中运行,并拥有自己的服务私有副本。

  

我唯一能理解的是,每次启动应用程序时,都会创建一个新的库实例。

图书馆没有实例。 Android库项目不是DLL - 它们更类似于静态库。

  

因此,TestApplicationOne中引用的库与TestApplicationTwo中引用的库不是同一个实例,因此未被通知。

更准确地说,TestApplicationOne中的服务是TestApplicationTwo中副本的服务的单独副本。

  

或者可以考虑任何可能的解决方案?

没有两个单独的应用程序。

或者,重新设计您的应用,只有一个人拥有该服务,另一个人使用第一个应用中的服务。

或者,在两个应用的清单中禁用该服务,并使用稳定的<intent-filter>导出(例如,使用自定义操作字符串)。要安装/运行的第一个应用程序使用PackageManager来查看服务是否存在(例如,它不是第一个应用程序) - 看到服务不存在,它会启用自己的服务副本。然后,第二个应用程序经历相同的过程,看到该服务已经存在,并使用远程副本而不是启用它自己。

第二个或第三个都不是很容易,因为数据只存在于一个应用程序(具有服务的应用程序)中。因此,如果卸载该应用程序,则另一个应用程序被搞砸,即使它恰好将服务代码作为禁用组件提供。如果应用程序被清楚地描述为具有主要/次要关系的用户(例如,应用程序及其插件),那么这可能会有用 - 如果应用程序不存在,用户希望不会期望插件能够正常工作,例如。当然,在这种情况下,插件首先没有自己的服务副本,但总是会寻找主应用程序。

答案 1 :(得分:2)

我不确定,但我认为服务标签的android:singleUser="true"属性可能就是您要找的。

If set to true, a single instance of this component will run 
 for all users. [boolean]

如果这没有帮助,那么您可以考虑一种解决方案,您可以从服务中为每个事件发送广播,并在您的2个应用程序中使用BroadcastRecievers而不是作为对象访问服务...