如何使用服务来使用位置数据?
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 链接来使用组件中的数据?