【问题标题】:android background location updates and wakelockandroid后台位置更新和唤醒锁
【发布时间】:2013-11-09 04:18:44
【问题描述】:

我正在开发一个 android 应用程序,我需要在后台使用 GPS 提供程序长时间获取位置更新,因此我需要在用户不再与其交互时发生位置更新。我对自己的比较 LocationManager 的 requestSingleUpdate(提供者,pendingIntent 版本)和 requestLocationUpdates(提供者,minTime,minDistance,intent 版本)做了一些测试。在我的 Droid Razr HD 上获取大量数据后,使用 requestLocationUpdates 似乎比 requestSingleUpdate 可靠得多(对于这两种方法,我实际上将报告的 GPS 位置与我实际所在的位置进行了比较,即不使用报告的准确性,以及 requestLocationUpdates不仅对于我的实际位置更加准确,而且它返回的位置修复时间与当前时间相同,比使用 requestSingleUpdate 选项更频繁)。我知道如何将 AlarmManager 与重复警报一起使用并调用 requestSingleUpdate 以便每次警报响起时我只需要保持唤醒锁,但由于使用 requestLocationUpdates 的准确性提高(至少在我的手机测试中)我想改用那个方法。我的问题是,如果我使用 requestLocationUpdates 方法,我真的不清楚我必须做些什么来保持唤醒锁以在用户不与手机交互时保持更新发生。我从一个从服务启动的单独线程调用 requestLocationUpdates(我读到这是标准模式)。我的问题是,我是否必须在希望位置更新不断更新的整个时间内保持唤醒锁?如果我没有自己的唤醒锁,位置更新是否会不断更新,每次新更新都会唤醒手机?如果这是真的,这些更新是否会创建自己的唤醒锁,如果是,它们何时释放唤醒锁?我似乎无法找到一个明确的答案。非常感谢任何帮助。

【问题讨论】:

    标签: android gps wakelock


    【解决方案1】:

    不,您不需要唤醒锁,因为操作系统会为您获取唤醒锁 (code)。当onLocationChange() 结束或您的广播接收器接收到意图时(对于接口的意图版本),唤醒锁将被释放。如果您在 onLocationChange() 中开始一些异步工作,例如使用其他线程,您需要自己的唤醒锁。

    【讨论】:

      【解决方案2】:

      我编写了一个飞行记录应用程序,它也需要每隔几秒更新一次以识别起飞和着陆。接收到的数据在服务中进行评估。要使服务保持活力,您将需要 WakeLock。当检测器(自动识别相关事件)启动时我得到锁,当用户关闭检测器时我释放锁;这也是服务的生命周期,因此在 onCreate 中获取锁并在 onDestroy 中释放。我使用 SCREEN_DIM_WAKE_LOCK 来节省一些电量。

      【讨论】:

      • 感谢您的提示。我想我可能还需要在前台启动服务,因为它可以运行一段时间并且我需要它保持运行。我知道这可能会消耗大量电池,但我只需要对其进行测试,因为我可能有一些方法可以通过其他设计决策来减轻消耗。如果没有,我将使用 requestSingleUpdates 返回到 AlarmManager 路由。我希望android文档在这方面好一点。似乎您必须从可能不同的地方拼凑很多信息才能看到整个画面。
      • 使用 Smasung Galaxy Tab 10.1N 并采用上述策略,可连续记录 6 小时,剩余约 40% 的电池电量。
      猜你喜欢
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      相关资源
      最近更新 更多