java - 安卓共享服务?

标签 java android service

首先我想说两件事。首先,抱歉,如果这个问题已经被问到,我已经搜索过关于这个主题的类似问题,但找不到解决方案。其次,对于冗长的问题感到抱歉,如果有任何错误,请告诉我,我一定会做出适当的更改:)。

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

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

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

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

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

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

我已尝试实现多种方法来解决此问题。比如使用Singleton模式来保留单个实例,但是问题好像还是存在。我对此的唯一理解是,每次启动任一应用程序时,都会创建一个新的库实例。因此,TestApplicationOne 中引用的库与 TestApplicationTwo 中引用的库不是同一个实例,因此不会收到通知。

有没有人有这方面的经验?或者能想到什么可能的解决方案?

在此先感谢您的帮助,非常感谢。

约翰

最佳答案

The issue I have is that when the service is started in either application, the other application is not notified of any events.

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

Such as using the Singleton pattern to retain a single instance, but the problem still seems to exist.

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

My only comprehension of this is that each time either application is started, a new instance of the library is created.

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

Thus the library referenced in TestApplicationOne is not the same instance as the library referenced in TestApplicationTwo, and as a result, not being notified.

更准确地说,TestApplicationOne中的服务是与 TestApplicationTwo 中的副本不同的服务副本.

Or can think of any possible solution?

不要有两个单独的应用程序。

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

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

第二个或第三个都不是很容易,因为数据仅存在于一个应用程序(具有服务的应用程序)中。因此,如果那个应用程序被卸载,另一个应用程序就会被搞砸,即使它碰巧有服务代码作为禁用组件可用。如果向用户清楚地描述了应用程序具有主要/次要关系(例如,应用程序及其插件),那么这可能会奏效——如果应用程序不存在,用户希望插件不会工作,例如。当然,在这种情况下,插件首先不会有自己的服务副本,但会始终查看主应用程序。

关于java - 安卓共享服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6204492/

相关文章:

java - 不支持 ISO 3166 国家 ES?

android - 选项卡式 Activity 中的 ScrollView 向下跳转

java - 使用JavaService添加Windows服务

java - 将用户首选项保存/加载到文件

java - Android:如果 EditText 在 x 秒内未更改,则调用函数

android - Android Studio 中存储的“"don' t 再次询问”设置在哪里

ios - iOS 中的位置服务

linux - 仅根据某些信号崩溃时如何使用 systemd 重启服务

c# - Lucene.net 无法搜索 ".net"

java - 如何强制 socket.close 释放写 block