设备休眠时,位置管理器是否继续工作?

4

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

  • 由于我从位置管理器请求更新(我不手动请求更新,而是订阅了 locationManager.requestLocationUpdates),即使设备使用 PARTIAL_WAKE_LOCK 进入睡眠状态,位置管理器是否仍然像平常一样工作?

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

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

2个回答

5
  1. 不,它不会。这里有更多(非常好的)信息http://code.google.com/p/android/issues/detail?id=10931,包括可能的解决方案/黑客。

  2. 就1而言,我只能做一个有教养的猜测,并说这不会有任何影响。

  3. 根据我所了解的,使用更新时无论使用LocationManager.NETWORK_PROVIDER还是LocationManager.GPS_PROVIDER都没有影响。

为了避免过分OQ,我有点好奇哪种应用程序需要获取唤醒锁来保持服务一直运行。据我所知,拥有唤醒锁并不能确保您的服务一直运行。唯一确保Service一直运行的方法是将其放在前台 (Service.startForeground())。否则,系统仍然可能会杀死服务,无论它是否获得唤醒锁。 话虽如此,如果它正在运行,可以使用Handler或其他方法进行工作。

如果您正在使用此方法(根据情况,我认为您是这样做的),我建议您不要这样做。基本上,您正在创建一个服务,将其运行在前台(猜测),并且当屏幕关闭时仅仅是为了请求位置更新而获取唤醒锁。这似乎有点过头了。

还有一种更有效率的方式,它比Handler.postAtTimeHandler.postDelayed可怕的时间具有更高的精度:AlarmManager.setRepeating()。将类型设置为ELAPSED_REALTIME_WAKEUP或RTC_WAKEUP,以便在设备休眠时运行,然后当闹钟事件被触发并由您创建的BroadcastReceiver接收到时,您可以请求更新并处理其他事件。

如果您不使用Handler,而只是请求位置更新,那么这种方法仍然可能更好,因为它不需要您拥有运行中的Service或获取唤醒锁。

看来LocationManager.addProximityAlert()是这里的正确方法。但这也有缺陷(见1)。

顺便提一下,这里有一个类似的问题:Android:手机睡眠时GPS位置更新?


1
在你帖子结尾提供的链接中,那个人指出屏幕“必须”打开才能获取GPS位置。你没有提到这一点。这是真的吗? - Johann
我想我做到了。请看1. 当设备处于睡眠状态时,屏幕是关闭的。如果屏幕开启,设备通常不处于睡眠模式。据我所知 :) - slinden77

0

我花了好几天的时间在 Nexus 6 上尝试使用 Android 6.0 获取 WiFi 和基于蜂窝网络的位置信息,但似乎原生的 Android 定位服务并不允许这样做。一旦设备被锁定,它仍然会收集位置更新事件约 10-15 分钟,然后停止提供任何位置更新。

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接