android背景位置更新和唤醒锁

时间:2013-11-09 04:18:45

标签: android gps wakelock

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

2 个答案:

答案 0 :(得分:3)

不,你不需要唤醒锁,因为操作系统为你取了唤醒锁(code)。当onLocationChange()结束或广播接收器收到意图(对于界面的意图版本)时,将释放唤醒锁。如果您在onLocationChange()中启动某些异步工作,例如使用其他线程,则需要自己的唤醒锁。

答案 1 :(得分:0)

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