我有两个Android应用程序使用完全相同的库。该库定义了一个Android服务。 首先,我在第一个应用程序中绑定服务 - 没关系。 其次,我在第二个应用程序中绑定服务,结果第二个服务的实例被引发,之后两个服务正在运行(一个用于第一个应用程序,一个用于第二个应用程序)。
我想只有一个服务实例,即。当第一个应用绑定服务时 - 服务开始工作。现在,当第二个应用程序绑定服务时,我想使用这个正在运行且只有一个服务实例的服务。
答案 0 :(得分:1)
通常,这是通过三个模块完成的:
两个应用程序(#2和#3)都可以绑定到该服务。区别在于#2在本地绑定,而#3通过IPC(进程间通信)远程绑定到它。请注意,为了使远程绑定的应用程序(#3)起作用,必须首先安装实际实现该服务的另一个应用程序(#2)。
This page讨论了如何使用AIDL。
修改强>
您的建议是在两个APK中打包服务。这应该导致每个应用程序绑定到其本地服务,这不是您想要的。
我唯一想到的就是让您的服务在您的AndroidManifest中拥有android:enabled="false"
。当您尝试绑定到服务时,如果绑定失败(bindService()
返回false),则可以使用PackageManager启用本地服务并尝试再次绑定。
理论上,第一个应用程序将无法绑定,因此它将启用自己的服务,但后续应用程序将找到并绑定到第一个应用程序。您必须尝试这一点,并确保它适用于不同的安装订单,以及测试如果您安装了两个应用程序并且卸载其服务为" Active"之一。
您仍然需要AIDL才能定义绑定接口并允许跨进程绑定。
尽管如此,我想知道这种努力是否值得。
答案 1 :(得分:0)
您需要为服务<service name='you service name' android:process='your_service_full_name(including package name)'
声明这样的内容,不要使用:
。