Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 广播、内容提供者和内容接收者的最佳实践_Android_Broadcastreceiver_Android Contentprovider_Contentobserver_Intentservice - Fatal编程技术网

Android 广播、内容提供者和内容接收者的最佳实践

Android 广播、内容提供者和内容接收者的最佳实践,android,broadcastreceiver,android-contentprovider,contentobserver,intentservice,Android,Broadcastreceiver,Android Contentprovider,Contentobserver,Intentservice,好的,所以在前面我会说我是Android新手。我做了一些小项目,玩了一些东西,读了很多很多书。因此,以下是我试图完成的任务: 我的手机前台有一个远程服务,可以通过wifi网络与其他android设备发送和接收信息。为使用此服务而构建的手机上的APK包含多个SQLite DB。我希望这些APK向服务注册这些内容提供商,以便服务始终知道将接收到的数据放在何处(我已完成此任务)。当数据进来时,我将确定它属于哪里,并将它放在正确的数据库中(这里没有问题)。那么,通知正确的活动已收到新数据的最佳方式是什么

好的,所以在前面我会说我是Android新手。我做了一些小项目,玩了一些东西,读了很多很多书。因此,以下是我试图完成的任务:

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


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

如果您询问当前活动了解其读取的内容提供程序中的数据已更改的最佳方式是什么,那么答案是ContentObserver

例如,假设您有一组活动和内容提供者。活动A是来自内容提供商A的项目列表视图,该列表视图通过某种游标适配器填充。每当您对ContentProviders内容URI进行查询时,光标应通过ContentObserver自动监视内容URI的更改

这之所以有效,是因为在ContentProvider中:

  • 查询方法将光标上的setNotificationUri调用到所查询的URI
  • 每当insert/update/delete方法中发生更改时,您都在对URI调用notifyChange
  • 如果您的服务中有其他数据可以更改,而这些数据没有绑定到ContentProvider,那么您可以选择如何传递数据。如果活动与服务位于同一APK中,则可以使用某种静态变量、应用程序上下文或其他自定义通信形式。这里的方法相当自由,因为您运行在同一个VM中,所以您有很多可用的东西

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

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

  • 您收到需要作出反应的广播意图(需要一段时间)
  • 使用广播意图中的一些信息向IntentService发送定向意图(带有设置组件名称的意图)
  • IntentService生成新的BG线程,或将该意图添加到现有BG线程上的处理队列中
  • 在IntentService中调用onHandleIntent函数,以便您现在可以使用所需的处理时间来处理该更改
    如果您询问当前活动了解其读取的内容提供程序中的数据已更改的最佳方式是什么,那么答案是ContentObserver

    例如,假设您有一组活动和内容提供者。活动A是来自内容提供商A的项目列表视图,该列表视图通过某种游标适配器填充。每当您对ContentProviders内容URI进行查询时,光标应通过ContentObserver自动监视内容URI的更改

    这之所以有效,是因为在ContentProvider中:

  • 查询方法将光标上的setNotificationUri调用到所查询的URI
  • 每当insert/update/delete方法中发生更改时,您都在对URI调用notifyChange
  • 如果您的服务中有其他数据可以更改,而这些数据没有绑定到ContentProvider,那么您可以选择如何传递数据。如果活动与服务位于同一APK中,则可以使用某种静态变量、应用程序上下文或其他自定义通信形式。这里的方法相当自由,因为您运行在同一个VM中,所以您有很多可用的东西

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

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

  • 您收到需要作出反应的广播意图(需要一段时间)