小编Col*_*ish的帖子

如何在库中为多个应用程序运行单件(共享)服务?

我写了一个在后台启动服务的库.它在所有应用程序中都运行良好

为了减少RAM的使用,我想避免为不同的应用程序运行多个服务.实际上,只使用一种服务来完成任务就足够了.

首先,我编写了一个AIDL文件,用于在应用程序/库之间建立IPC.使用签名权限将服务定义为导出/启用.由于所有应用程序都是完全相同的服务,因此无法检查是否有任何应用程序启动或关闭.绑定服务以检查服务的状态时,由于BIND_AUTO_CREATE标志的性质,它总是创建和销毁自己的服务.这就是为什么不能从导出的服务获得任何类型的信息,如果它真的启动并运行.

然后,我尝试将内容提供程序定义到库的清单中.我的目标是通过它分享服务信息.在导出的服务和应用程序主进程之间进行通信是非常好的机制.但它不适用于多个实例.因为从库中获取内容提供者信息的应用程序使用相同的权限,因此无法安装第二个.它给出了DUPLICATE_PROVIDER_AUTHORITY错误.

你对这个问题有什么建议?有没有选项来创建主/从机制?是否可以使应用程序的服务单例使用库项目?

PS:尝试过广播和共享偏好技术.但是他们无法从导出的服务中收听回调.

android aidl android-service android-contentprovider android-service-binding

14
推荐指数
1
解决办法
1159
查看次数

如何为manifestPlaceholder设置默认值

我在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标记?

我只想定义一个默认值,如果用户想要更改它,用户应该可以自由提供一个值.

android android-manifest build.gradle android-gradle-plugin

10
推荐指数
1
解决办法
404
查看次数

ContentObserver用于监听联系人的更改

我真的不明白为什么内容观察者会听取与联系信息无关的更改.

我只是注册了我想听的变化的URI:

getContentResolver().registerContentObserver(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, true, contactsObserver);
Run Code Online (Sandbox Code Playgroud)

但是在给某人打电话或发短信后,它会在ContentObserver中触发并调用onChange方法.所以我需要将所有联系人列表与我的应用程序重新同步,尽管我不需要这样做.

只有我感兴趣的领域:

  • ContactsContract.CommonDataKinds.Phone.CONTACT_ID
  • ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
  • ContactsContract.CommonDataKinds.Phone.NUMBER

我应该实现哪些更改来监听此数据库项目的更改?

android android-contacts contentobserver android-query

9
推荐指数
1
解决办法
2114
查看次数