4

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

  • 由于我向位置管理器请求更新(我没有手动请求更新而是订阅locationManager.requestLocationUpdates)......即使设备进入睡眠状态,位置管理器是否继续正常/正常工作PARTIAL_WAKE_LOCK

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

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

4

2 回答 2

5
  1. 不,不是的。更多(非常好的)信息在这里,包括可能的解决方案/黑客。

  2. 关于 1,我必须做出有根据的猜测,并说这不会有什么不同

  3. 据我所知,您使用哪个提供商进行更新LocationManager.NETWORK_PROVIDERLocationManager.GPS_PROVIDER.

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

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

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

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

这似乎LocationManager.addProximityAlert()是去这里的方式。这也是有缺陷的(见1)

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

于 2012-08-22T01:37:24.350 回答
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 /位置/包摘要

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

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

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

于 2016-08-24T13:27:51.307 回答