Android 内容提供商还是服务提供商?

Android 内容提供商还是服务提供商?,android,android-service,android-contentprovider,Android,Android Service,Android Contentprovider,我正在写一个显示“日本传统时间”(简称JTT)的应用程序。有几个组件(通知、小部件、应用程序本身、警报)都使用相同的数据-当前JTT 我当前的版本使用一个服务来完成所有的计算,并使用一个处理程序来通知每个人“滴答”,模仿ACTION\u TIME\u TICK 然而,对于警报,我还需要有一种方法将“正常时间”转换为JTT,反之亦然。这些计算需要相当多的CPU(都是基于日出和日落),因此我更喜欢在一个地方完成,然后缓存(计算知道日出和日落时间的东西没有那么重) 所以我现在有几种方法可以做到这一点:

我正在写一个显示“日本传统时间”(简称JTT)的应用程序。有几个组件(通知、小部件、应用程序本身、警报)都使用相同的数据-当前JTT

我当前的版本使用一个服务来完成所有的计算,并使用一个处理程序来通知每个人“滴答”,模仿
ACTION\u TIME\u TICK

然而,对于警报,我还需要有一种方法将“正常时间”转换为JTT,反之亦然。这些计算需要相当多的CPU(都是基于日出和日落),因此我更喜欢在一个地方完成,然后缓存(计算知道日出和日落时间的东西没有那么重)

所以我现在有几种方法可以做到这一点:

  • 让它继续使用
    • 并使用绑定请求我需要的数据。它实际上已经在一个案例中完成了,而且似乎有点麻烦,因为我必须处理异步响应
  • 移动到内容提供商
    • 使用内容观察者而不是广播
    • 或从提供商发送广播
  • 兼而有之
    • 使用内容提供商计算服务的数据,然后在需要时广播数据

哪一个更好?也许还有别的吗?

内容提供程序用于结构化数据,因此它并不真正适合您的用例。不确定“异步响应”是什么意思?调用远程服务通常与本地函数调用类似,完成后将阻塞并返回一个值。如果您必须通知多个组件,则广播是最佳选择。如果所有组件都在同一进程中,请使用LocalBroadcast进行探索(检查Android支持库源代码),或者在需要发送系统范围(常规)的应用程序时,对其设置权限以确保其他应用程序无法获取

我坚持“仅服务”——我发现粘性广播实际上涵盖了我在普通广播中遇到的问题(必须在注册后但在获得第一个“勾号”之前向服务请求最新数据),这使得我需要实际服务连接的情况大大减少

现在我正在使用
Messenger
与服务进行通信,所以要从绑定服务请求数据,我会创建一条消息并发送它,然后在我自己的
处理程序中得到响应。但是我会研究同步通信,谢谢你的想法。啊,我明白了。我在考虑一个基于AIDL的服务,您只需在本地存根上调用方法,从而获得同步调用。