我写了一个在后台启动服务的库.它在所有应用程序中都运行良好
为了减少RAM的使用,我想避免为不同的应用程序运行多个服务.实际上,只使用一种服务来完成任务就足够了.
首先,我编写了一个AIDL文件,用于在应用程序/库之间建立IPC.使用签名权限将服务定义为导出/启用.由于所有应用程序都是完全相同的服务,因此无法检查是否有任何应用程序启动或关闭.绑定服务以检查服务的状态时,由于BIND_AUTO_CREATE标志的性质,它总是创建和销毁自己的服务.这就是为什么不能从导出的服务获得任何类型的信息,如果它真的启动并运行.
然后,我尝试将内容提供程序定义到库的清单中.我的目标是通过它分享服务信息.在导出的服务和应用程序主进程之间进行通信是非常好的机制.但它不适用于多个实例.因为从库中获取内容提供者信息的应用程序使用相同的权限,因此无法安装第二个.它给出了DUPLICATE_PROVIDER_AUTHORITY错误.
你对这个问题有什么建议?有没有选项来创建主/从机制?是否可以使应用程序的服务单例使用库项目?
PS:尝试过广播和共享偏好技术.但是他们无法从导出的服务中收听回调.
android aidl android-service android-contentprovider android-service-binding
我在build.gradle文件中使用manifestPlaceholder标记用于库项目.
使用该库的人应该正确定义它.
库中的AndroidManifest.xml:
<meta-data
android:name="library_id"
android:value="${libraryId}"/>
Run Code Online (Sandbox Code Playgroud)
应用程序端的Build.gradle文件:
manifestPlaceholders = [libraryId: "example"]
Run Code Online (Sandbox Code Playgroud)
是否有任何选项可以覆盖库侧的manifestPlaceholder标记?
我只想定义一个默认值,如果用户想要更改它,用户应该可以自由提供一个值.
我真的不明白为什么内容观察者会听取与联系信息无关的更改.
我只是注册了我想听的变化的URI:
getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, contactsObserver);
Run Code Online (Sandbox Code Playgroud)
但是在给某人打电话或发短信后,它会在ContentObserver中触发并调用onChange方法.所以我需要将所有联系人列表与我的应用程序重新同步,尽管我不需要这样做.
只有我感兴趣的领域:
我应该实现哪些更改来监听此数据库项目的更改?