Android共享服务?

首先我想说两件事。 首先是,如果这个问题已经被问到,我已经search了围绕这个主题的类似的问题,但无法find解决scheme。 其次,对于冗长的问题抱歉,请让我知道任何错误,我一定会作出适当的修改:)。

我对Android开发(约2个月)比较陌生,请原谅我的无知。 我有的问题是关于Android服务

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

  • 包含一个小testing服务( myService )的android库。
  • 一个可以访问android库的应用程序( TestApplicationOne )。
  • 另一个应用程序( TestApplicationTwo )也可以访问android库。

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

运行时,上面的解决scheme似乎工作正常。 不过,我现在有另一个应用程序( TestApplicationTwo ),它也想使用与上面相同的服务。 TestApplicationTwo的实现是根据第一个应用程序( TestApplicationOne )的相同工作原理/规范创build的。

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

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

有没有人在这个问题上有任何经验? 或者可以想出任何可能的解决scheme?

提前感谢您的帮助,非常感谢。

约翰

Solutions Collecting From Web of "Android共享服务?"

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

那是因为你有两个服务。 仅仅因为服务被封装在一个Android库项目中并不奇怪地导致两个不同的应用程序使用相同的副本。

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

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

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

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

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

更准确地说, TestApplicationOne的服务是与TestApplicationOne中的副本相分离的服务副本。

或者可以想出任何可能的解决scheme?

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

或者,重新devise您的应用程序,使其中只有一个具有该服务,另一个使用第一个应用程序提供的服务。

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

第二个或第三个都不是很容易,只是因为数据只存在于一个应用程序(具有服务的应用程序)中。 因此,如果该应用程序已卸载,则另一个应用程序将被拧紧,即使该服务代码可能作为禁用组件提供。 如果应用程序清楚地向用户描述为具有主要/次要关系(例如,应用程序及其插件),那么这可能会解决 – 用户希望如果应用程序不在那里,则不希望插件工作,例如。 当然,在这种情况下,插件首先不会拥有自己的服务副本,但总是会看到主应用程序。

我不知道,但我认为服务标签的android:singleUser="true"属性可能是你正在寻找的。

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

如果这没有帮助,那么你可能会考虑一个解决scheme,在该解决scheme中,您从每个事件的服务中发送广播,并在您的2个应用程序中拥有BroadcastRecievers,而不是作为对象访问服务…