设备进入睡眠状态时,位置管理器是否继续工作?

时间:2012-08-21 22:18:05

标签: android sleep locationmanager wakelock

当布尔标志设置为true时,我的应用程序请求在后台服务中进行更新。如果flag设置为true,那么我获取PARTIAL_WAKE_LOCK以让我的后台服务运行。   我的问题是:

  • 由于我从位置管理器请求更新(我不手动请求更新但订阅了locationManager.requestLocationUpdates)...即使设备进入睡眠状态,locationManager也会保持正常/正常工作PARTIAL_WAKE_LOCK

  • 我读过有一个WifiLock -> WIFI_MODE_SCAN_ONLY,我没有收到。由于位置管理器使用wifi扫描通过wifi热点检测位置,我是否也应该获取它?

  • 当设备进入睡眠状态时gps位置更新怎么办?

2 个答案:

答案 0 :(得分:5)

  1. 不,它没有。更多(非常好)信息here,包括可能的解决方案/黑客。

  2. 关于1,我必须做出有根据的猜测并说它不会有所作为

  3. 从我可以收集到的内容来看,您使用哪个提供商进行更新LocationManager.NETWORK_PROVIDERLocationManager.GPS_PROVIDER没有任何区别。

  4. 有点OQ的危险,我有点好奇哪种应用程序需要获取唤醒锁以保持服务运行。据我所知,使用唤醒锁定并不能确保Service继续运行。确保Service继续运行的唯一方法是将其置于前台(Service.startForeground())。否则系统仍可能终止服务,无论它是否获得唤醒锁定。 话虽如此,如果它正在运行,它可以使用Handler或其他东西。

    如果您正在使用这种方法,并且我认为您是基于该方案,我会建议反对它。基本上你正在创建一个服务,让它在前台运行(猜测)你正在获取唤醒锁定只是为了在屏幕关闭时请求位置更新。这似乎有点矫枉过正。

    有一种更有效的方法,它具有比Handler.postAtTimeHandler.postDelayedAlarmManager.setRepeating()的可怕时间更精确的时机所带来的好处。将类型设置为ELAPSED_REALTIME_WAKEUP或RTC_WAKEUP,以便在设备休眠时运行,然后当警报事件被触发并由BroadcastReceiver接收时,您必须创建,您可以请求更新并处理其他事件。

    如果您没有使用Handler,但仅仅是请求位置更新,这种方法可能会更好,因为它不需要您运行Service或获取唤醒锁。

    似乎LocationManager.addProximityAlert()是要走的路。哪个也有缺陷(见1)

    顺便提一句:Android: GPS location updates when the cellphone is in sleep?

答案 1 :(得分:0)

我花了几天的时间试图在Nexus 6上使用Android 6.0锁定屏幕上的WiFi和基于单元格的位置。看起来像原生的android位置服务简单不允许这样做。一旦设备被锁定,它仍然会收集位置更新事件10-15分钟,然后停止提供任何位置更新。

在我的情况下,解决方案是从原生Android位置服务切换到名为com.google.android.gms.location的Google Play服务包装:https://developers.google.com/android/reference/com/google/android/gms/location/package-summary

是的,我知道有些Android设备缺少GMS,但对于我的应用程序来说,这是唯一可以执行的解决方案。

即使在后台和设备屏幕被锁定,它也不会停止发送位置更新。

我个人更喜欢RxJava库将此服务包装成一个流(包括示例):https://github.com/mcharmas/Android-ReactiveLocation