如何使用服务来使用位置数据?

Posted

技术标签:

【中文标题】如何使用服务来使用位置数据?【英文标题】:How do I use a Service to consume Location data? 【发布时间】:2014-09-30 20:43:20 【问题描述】:

由于我有一个长时间运行的任务要在我的应用后台执行,我正在尝试实现一个服务来完成一项工作。

此服务使用来自LocationClient 实例的位置数据,每个请求都使用 PendingIntent 触发。最低目标版本阻止我使用新的 LocationServices,android 文档建议我使用 PendingIntent 版本的 LocationClient.requestLocationUpdates(...) 方法,因为 application may have been killed by the system。

Every example I've 看到与类似描述匹配的实现 IntentService 并覆盖 onHandleIntent(Intent intent) 额外接收意图 KEY_LOCATION_CHANGED。但是,Service 中没有这样的方法,并且没有像我预期的那样将这样的意图传递给 onStartCommand(...)。

此代码用于设置对位置数据的请求,来自 LocationRequester 对象(任何时候都可以运行任意数量的这些,但是当只生成一个并发出请求时,结果是相同的):

Intent intent = new Intent(context, MyLocationService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);
locationClient.requestLocationUpdates(someLocationRequest, pendingIntent);

当我在上面的代码中使用 MyLocation*Intent*Service 时,Intent 将被传递到 MyLocationIntentService.onHandleIntent(intent),并且我会寻找额外的 KEY_LOCATION_CHANGED。对服务进行更改后,我不知道如何使用位置数据。我已确保在发出请求时已连接 LocationClient。

我已经尝试监控 onStartCommand(...) 并且意图没有在那里传递。我的问题是:如何在服务实现中使用位置数据?

如果我有任何不清楚的地方或需要更多信息,请告诉我。 谢谢!

【问题讨论】:

【参考方案1】:

为自己找到了一个解决方案,虽然它不像我想要的那么干净。

我使用 Service 创建 Requester 对象,它们是 LocationListener 的每个实现,并且只使用它们自己的请求。这意味着放弃问题中的几个约束:(。Requester 对象将在接收到位置后(在覆盖的 onLocationChanged(...) 方法中,使用作为 Extras 的特定细节触发服务的意图。

换句话说,Service 并没有直接使用位置数据——请求它的个人做了,然后通过创建 Intent、附加相关数据并调用 startService(...) 将其转发回 Service,这被 Service.onStartCommand(...) 拾取。

【讨论】:

以上是关于如何使用服务来使用位置数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何分别使用服务帐号和 API 密钥来使用 BigQuery?

如何使用组件类中的 react-router 链接来使用组件中的数据?

如何保护 webHttpBinding?

如何使用带有熊猫的随机森林来使用特征重要性?

Quickblox:如何使用分页来使用 Web SDK 获取自定义对象

我如何应用逻辑回归算法来使用卫星数据绘制决策边界