广播,ContentProviders和ContentRecievers的最佳实践

时间:2011-09-29 13:15:50

标签: android broadcastreceiver android-contentprovider contentobserver intentservice

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

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

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

1 个答案:

答案 0 :(得分:4)

如果你问的是当前Activity知道数据在ContentProvider中是否已经更改的最佳方式是什么,而不是答案是ContentObserver。

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

这可行的原因是因为在ContentProvider中:

  1. 您的查询方法将游标上的setNotificationUri调用到查询的URI。
  2. 每当插入/更新/删除方法发生更改时,您都会在URI上调用notifyChange。
  3. 如果您的服务中有其他数据可能与ContentProvider无关,那么您可以选择如何传递数据。如果活动与您的服务在同一个APK中,那么您可以使用某种静态变量,应用程序上下文或其他一些自定义通信形式。这里的方法相当宽松,因为您在同一个VM中运行,因此您可以使用很多东西。

    在您的情况下,听起来大多数活动都会在单独的APK中。如果是这种情况,您可能希望发出广播意图,让整个系统了解变化。如果这些更改仅在活动运行时很重要,则可以在关注更改的活动生命周期内注册BroadcastReceiver。或者,您可以将BroadcastReceiver放在应用程序清单中,并始终接收该更改。

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

    1. 您收到了需要做出反应的广播意图(并且需要一段时间)
    2. 使用来自广播意图的一些信息向IntentService发送定向意图(具有设置组件名称的意图)。
    3. IntentService生成新的BG线程,或将意图添加到现有BG线程上的处理队列
    4. 在IntentService中调用onHandleIntent函数,以便您现在可以使用所需的处理时间来处理该更改。