如果您要问当前 Activity 知道它正在读取的 ContentProvider 中的数据已更改的最佳方法是什么,那么答案是 ContentObserver。
可以说,例如,您有一组活动和内容提供者。Activity A 是来自 Content Provider A 的项目的列表视图,该列表视图是通过某种 CursorAdapter 填充的。每当您对 ContentProviders CONTENT_URI 进行查询时,游标应通过 ContentObserver 自动监视 CONTENT_URI 的更改。
之所以可行,是因为在 ContentProvider 中:
- 您的查询方法将光标上的 setNotificationUri 调用到被查询的 URI。
- 每当在插入/更新/删除方法中发生更改时,您都会在 URI 上调用 notifyChange。
如果您的服务中有其他数据可以更改,但与 ContentProvider 无关,那么您在如何传递数据方面有一些选择。如果 Activity 与您的服务在同一个 APK 中,那么您可以使用某种静态变量、应用程序上下文或其他一些自定义形式的通信。这里的方法相当自由,因为您在同一个 VM 中运行,因此您可以使用很多东西。
在您的情况下,听起来大多数活动将在单独的 APK 中。如果是这种情况,您可能希望发送广播 Intent 以让整个系统知道更改。如果这些更改仅在 Activity 运行时有意义,您可以在关注更改的 Activity 的生命周期内注册一个 BroadcastReceiver。或者,您可以将 BroadcastReceiver 放在应用程序清单中,并始终接收该更改。
这将我们带到了 IntentServices。IntentServices 是在 Android 中处理长时间运行任务的“最简单”的方式。他们所做的只是创建一个后台线程来处理发送到服务中的意图。一个常见的用例如下:
- 您收到一个需要做出反应的广播意图(这需要一段时间)
- 使用广播意图中的一些信息向 IntentService 发送定向意图(具有设置组件名称的意图)。
- IntentService 要么产生一个新的 BG 线程,要么将意图添加到现有 BG 线程上的处理队列中
- 在 IntentService 中调用 onHandleIntent 函数,以便您现在可以使用尽可能多的处理时间来处理该更改。