【问题标题】:does location manager keeps working when device goes to sleep?设备进入睡眠状态时位置管理器是否继续工作?
【发布时间】:2023-04-01 14:47:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: android sleep locationmanager wakelock


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

    2. 关于 1,我必须做出有根据的猜测,并说它不会有任何影响

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

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

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

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

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

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

    顺便提一下类似的问题:Android: GPS location updates when the cellphone is in sleep?

    【讨论】:

    • 在您在帖子末尾提供的链接中,该人表示“必须”打开屏幕才能获取 GPS 位置。你没有提到那个。这是真的吗?
    • 我想我做到了。参见 1. 当设备处于睡眠状态时,屏幕关闭。如果屏幕打开,则设备通常不处于睡眠模式。据我所知:)
    【解决方案2】:

    我花了几天时间尝试在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多