【问题标题】:ContentProvider or Service?内容提供者还是服务?
【发布时间】:2012-12-15 06:38:01
【问题描述】:

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

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

但是,对于警报,我还需要一种将“通常时间”转换为 JTT 的方法,反之亦然。计算非常耗费 CPU(这一切都基于日出和日落),因此我更喜欢在一个地方完成所有计算然后缓存(计算知道日出和日落时间的东西并不那么繁重)。

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

  • 保持一切正常
    • 并使用绑定来请求我需要的数据。它实际上已经在一个案例中完成了,看起来有点麻烦,因为我必须处理异步响应
  • 移至内容提供商
    • 并使用内容观察者而不是广播
    • 或从提供商发送广播
  • 结合两种方式
    • 使用内容提供者计算服务数据,然后在需要时广播它

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

【问题讨论】:

    标签: android android-service android-contentprovider


    【解决方案1】:

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

    【讨论】:

    • 现在我正在使用Messenger 与服务通信,因此要从绑定服务请求数据,我创建一条消息并发送它,然后在我自己的Handler 中获得响应。
    • 但是我会研究同步通信,谢谢你的想法。
    • 啊,我明白了。我正在考虑一个基于 AIDL 的服务,您只需调用本地存根上的方法,从而获得同步调用。
    【解决方案2】:

    我坚持“只是服务” - 我发现粘性广播实际上涵盖了我在普通广播中遇到的问题(必须在注册后但在获得第一个“tick”之前从服务请求最新数据)然后离开我需要实际服务连接的情况要少得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      相关资源
      最近更新 更多