1

好吧,等等,我会说我是Android的新手。我做了几个小项目,玩了几件事,做了大量的阅读。所以这里是我想要完成的任务:Broadcasts,ContentProviders和ContentRecievers的最佳做法

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

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

回答

4

如果您询问当前Activity的最佳方式是如何知道ContentProvider中的数据已更改,则它正在读取,而答案是ContentObserver。

可以说,例如,你有一组Activities和ContentProviders。活动A是来自内容提供者A的项目的列表视图,并且该列表视图通过某种类型的CursorAdapter来填充。无论何时您对ContentProviders CONTENT_URI进行查询,光标都应该自动监视CONTENT_URI以通过ContentObserver进行更改。

这部作品的原因是因为在ContentProvider:

  1. 您所查询的方法对你的光标移动到被查询的URI调用setNotificationUri。
  2. 无论何时在插入/更新/删除方法中发生变化,您都在调用URI的notifyChange。

如果您的服务中还有其他可以更改的数据与ContentProvider无关,那么您在传输数据方面有几个选择。如果活动与您的服务位于相同的APK中,则可以使用某种静态变量或应用程序上下文或其他自定义通信形式。这里的方法比较自由,因为你在同一个虚拟机上运行,​​所以你有很多东西可用。

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

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

  1. 您收到你需要反应(这将需要一段时间)广播意图
  2. 发送定向意图(意图用一组组件名)到IntentService与广播意图中的一些信息。
  3. IntentService要么产生一个新BG线程,或增加意图处理队列中现有的BG螺纹
  4. 的onHandleIntent函数被调用的IntentService上,以便您可以立即处理使用尽可能多的处理时间,因为你是改变想。
+0

谢谢。我与CP和CO达成了一致。对BR和CI没有把握。因此,在APK的Manifest文件中定义的广播接收器将允许APK接收广播,即使它不是正在运行的APK(这可以帮助我很多)。不仅仅是我想出一个设计,让它能够很好地发挥作用,并且能够满足我的需求。 – jjNford

+0

不要害怕提问...这种设计与我正在研究的一个重大项目非常相似。 –

+0

谢谢你,真棒。我正在设计一个“内部应用程序”。现在我正在尝试创建一个类似于应用程序的框架,我为它提供了一个jar接口文件(它处理所有IPC到运行的远程服务)。 APK将使用我的界面来注册他们的ContentProvider和Message ID。我希望在电话上收到新消息时将其添加到正确的ContentProvider中,并通知使用该消息类型的活动(所以我需要制作注册BroadcastReceivers并动态创建广播的方法)。任何建议帮助!谢谢! – jjNford