1

好的,我会说我是 Android 新手。我做了一些小项目,玩了一些东西,做了很多阅读。所以这是我要完成的任务:

我有一个在手机前台运行的远程服务,可以通过 wifi 网络与其他 android 设备发送和接收信息。为使用此服务而构建的手机上的 APK 包含多个 SQLite DB。我希望这些 APK 在服务中注册内容提供者,以便服务始终知道将接收到的数据放在哪里(我已经完成了这项任务)。当数据进入时,我将确定它属于哪里并将其放置在正确的数据库中(这里没问题)。那么,通知正确活动已收到新数据的最佳方式是什么。我是否注册广播接收器以供我的服务调用?如果 APK 已被操作系统杀死,广播接收器会工作吗?一旦加载了正确的活动,我会使用内容观察器来显示新数据吗?我为什么要使用 IntentServices?

我很抱歉问了这么多问题。就像我说的我学得很快,但是 Android 的 SKD 很大,而且有很多很酷的东西。我想确保我通过最佳实践正确地思考问题,并使其非常易于维护和扩展。感谢我能得到的任何帮助或建议。

4

1 回答 1

4

如果您要问当前 Activity 知道它正在读取的 ContentProvider 中的数据已更改的最佳方法是什么,那么答案是 ContentObserver。

可以说,例如,您有一组活动和内容提供者。Activity A 是来自 Content Provider A 的项目的列表视图,该列表视图是通过某种 CursorAdapter 填充的。每当您对 ContentProviders CONTENT_URI 进行查询时,游标应通过 ContentObserver 自动监视 CONTENT_URI 的更改。

之所以可行,是因为在 ContentProvider 中:

  1. 您的查询方法将光标上的 setNotificationUri 调用到被查询的 URI。
  2. 每当在插入/更新/删除方法中发生更改时,您都会在 URI 上调用 notifyChange。

如果您的服务中有其他数据可以更改,但与 ContentProvider 无关,那么您在如何传递数据方面有一些选择。如果 Activity 与您的服务在同一个 APK 中,那么您可以使用某种静态变量、应用程序上下文或其他一些自定义形式的通信。这里的方法相当自由,因为您在同一个 VM 中运行,因此您可以使用很多东西。

在您的情况下,听起来大多数活动将在单独的 APK 中。如果是这种情况,您可能希望发送广播 Intent 以让整个系统知道更改。如果这些更改仅在 Activity 运行时有意义,您可以在关注更改的 Activity 的生命周期内注册一个 BroadcastReceiver。或者,您可以将 BroadcastReceiver 放在应用程序清单中,并始终接收该更改。

这将我们带到了 IntentServices。IntentServices 是在 Android 中处理长时间运行任务的“最简单”的方式。他们所做的只是创建一个后台线程来处理发送到服务中的意图。一个常见的用例如下:

  1. 您收到一个需要做出反应的广播意图(这需要一段时间)
  2. 使用广播意图中的一些信息向 IntentService 发送定向意图(具有设置组件名称的意图)。
  3. IntentService 要么产生一个新的 BG 线程,要么将意图添加到现有 BG 线程上的处理队列中
  4. 在 IntentService 中调用 onHandleIntent 函数,以便您现在可以使用尽可能多的处理时间来处理该更改。
于 2011-09-29T14:22:17.710 回答