首先,我想说两件事。第一个是,对不起,如果已经问过这个问题,我已经围绕这个主题搜索了类似的问题,但无法找到解决方案。对于冗长的问题,对不起,请告诉我任何错误,我一定会做出适当的修改:)。
我对Android开发相对较新(大约2个月),所以请原谅我的无知。我的问题是关于android服务。
我的问题如下,我创建了以下3个应用程序:
我当前的解决方案如下工作, TestApplicationOne 引用自定义库并使用此库通过 bindService()<连接到服务( myService ) / em>方法。连接成功后,应用程序会将自己添加到位于 myService 中的观察者集合。每次服务需要广播消息时,都会通知此集合中的每个对象。
运行时,上述解决方案似乎运行正常。但是,我现在有另一个应用程序( TestApplicationTwo ),它也想使用与上面相同的服务。 TestApplicationTwo 的实现是针对第一个应用程序( TestApplicationOne )的相同工作/规范创建的。
我遇到的问题是,当在任一应用程序中启动服务时,其他应用程序不会收到任何事件的通知。
我尝试过几种方法来解决这个问题。比如使用Singleton模式来保留单个实例,但问题似乎仍然存在。我唯一能理解的是,每次启动应用程序时,都会创建一个新的库实例。因此, TestApplicationOne 中引用的库与 TestApplicationTwo 中引用的库不是同一个实例,因此未被通知。
有没有人在这个问题上有经验?或者可以考虑任何可能的解决方案?
感谢您提前获得任何帮助,非常感谢。
约翰
答案 0 :(得分:10)
我遇到的问题是,当在任一应用程序中启动服务时,其他应用程序不会收到任何事件的通知。
那是因为你有两项服务。仅仅因为该服务打包在Android库项目中,并不会以某种方式神奇地导致两个不同的应用程序使用相同的副本。
比如使用Singleton模式来保留单个实例,但问题似乎仍然存在。
这两个应用程序都在不同的进程中运行,并拥有自己的服务私有副本。
我唯一能理解的是,每次启动应用程序时,都会创建一个新的库实例。
图书馆没有实例。 Android库项目不是DLL - 它们更类似于静态库。
因此,TestApplicationOne中引用的库与TestApplicationTwo中引用的库不是同一个实例,因此未被通知。
更准确地说,TestApplicationOne
中的服务是TestApplicationTwo
中副本的服务的单独副本。
或者可以考虑任何可能的解决方案?
没有两个单独的应用程序。
或者,重新设计您的应用,只有一个人拥有该服务,另一个人使用第一个应用中的服务。
或者,在两个应用的清单中禁用该服务,并使用稳定的<intent-filter>
导出(例如,使用自定义操作字符串)。要安装/运行的第一个应用程序使用PackageManager
来查看服务是否存在(例如,它不是第一个应用程序) - 看到服务不存在,它会启用自己的服务副本。然后,第二个应用程序经历相同的过程,看到该服务已经存在,并使用远程副本而不是启用它自己。
第二个或第三个都不是很容易,因为数据只存在于一个应用程序(具有服务的应用程序)中。因此,如果卸载该应用程序,则另一个应用程序被搞砸,即使它恰好将服务代码作为禁用组件提供。如果应用程序被清楚地描述为具有主要/次要关系的用户(例如,应用程序及其插件),那么这可能会有用 - 如果应用程序不存在,用户希望不会期望插件能够正常工作,例如。当然,在这种情况下,插件首先没有自己的服务副本,但总是会寻找主应用程序。
答案 1 :(得分:2)
我不确定,但我认为服务标签的android:singleUser="true"
属性可能就是您要找的。 p>
If set to true, a single instance of this component will run
for all users. [boolean]
如果这没有帮助,那么您可以考虑一种解决方案,您可以从服务中为每个事件发送广播,并在您的2个应用程序中使用BroadcastRecievers而不是作为对象访问服务...