使用 FusedLocationProviderApi 或使用 AlarmManager 启动定期位置更新

Posted

技术标签:

【中文标题】使用 FusedLocationProviderApi 或使用 AlarmManager 启动定期位置更新【英文标题】:Initiate periodic location updates using FusedLocationProviderApi or use AlarmManager instead 【发布时间】:2017-05-02 04:01:27 【问题描述】:

我正在开发一个应用程序,该应用程序每 3 小时根据当前位置检查一次天气。我正在使用 FusedLocationProviderApi 获取位置,并将 pendingIntent 用于启动 IntentService 的 BroadCastReceiver。

在 FusedLocationProviderApi 中,您可以在创建 LocationRequest 时指定时间间隔。因此,如果我将时间间隔指定为 3 小时,最快的时间间隔也指定为 3 小时(我不想在那之前获得更新),如果在进行位置更新时位置不可用会发生什么?

我是否仍会在预定时间获得位置更新意图?如果位置不可用,我想使用最后一个已知位置,但我需要确定我仍然在预定时间获得 PendingIntent。

或者使用警报管理器来处理周期性工作并从 IntentService 中请求位置更新是否更好?

谢谢

【问题讨论】:

【参考方案1】:

在 FusedLocationProviderApi 中,您可以在创建 LocationRequest 时指定一个时间间隔。因此,如果我将时间间隔指定为 3 小时,最快的时间间隔也指定为 3 小时(我不想在那之前获得更新),如果在进行位置更新时位置不可用会发生什么?

在此 scnerio 设备中,必须保持唤醒状态才能保持您的位置请求。所以这意味着你必须有一个不间断的(理论上)后台服务,以及部分唤醒锁。听起来不太好。

相反,您可以参考设置为每 3 小时唤醒一次的 AlarmManager 方法。然后想法如下所示

设备唤醒 尽快提出位置请求(将间隔值设置为零) 收到位置后继续睡觉(同时也做你的实际工作)

【讨论】:

谢谢。我认为使用 PendingIntent 对 WakefulBroadcastReceiver 进行位置更新,该接收器在 IntentService 中开始请求位置的天气,如果设备处于睡眠模式(无需在等待时保持唤醒),将处理这种情况。 您对来自 FusedLocationProviderApi 的定期报告的可靠性有任何经验吗?它和 AlarmManager 一样可靠吗? 请检查这个库cwac-locpoll。这正是您所需要的,但使用 LocationManager。您可以实现融合位置提供程序而不是旧的。

以上是关于使用 FusedLocationProviderApi 或使用 AlarmManager 启动定期位置更新的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)