当布尔标志设置为true时,我的应用程序请求在后台服务中进行更新。如果flag设置为true,那么我获取PARTIAL_WAKE_LOCK
以让我的后台服务运行。
我的问题是:
由于我从位置管理器请求更新(我不手动请求更新但订阅了locationManager.requestLocationUpdates
)...即使设备进入睡眠状态,locationManager也会保持正常/正常工作PARTIAL_WAKE_LOCK
?
我读过有一个WifiLock -> WIFI_MODE_SCAN_ONLY
,我没有收到。由于位置管理器使用wifi扫描通过wifi热点检测位置,我是否也应该获取它?
当设备进入睡眠状态时gps位置更新怎么办?
答案 0 :(得分:5)
不,它没有。更多(非常好)信息here,包括可能的解决方案/黑客。
关于1,我必须做出有根据的猜测并说它不会有所作为
从我可以收集到的内容来看,您使用哪个提供商进行更新LocationManager.NETWORK_PROVIDER
或LocationManager.GPS_PROVIDER
没有任何区别。
有点OQ的危险,我有点好奇哪种应用程序需要获取唤醒锁以保持服务运行。据我所知,使用唤醒锁定并不能确保Service
继续运行。确保Service
继续运行的唯一方法是将其置于前台(Service.startForeground()
)。否则系统仍可能终止服务,无论它是否获得唤醒锁定。
话虽如此,如果它正在运行,它可以使用Handler
或其他东西。
如果您正在使用这种方法,并且我认为您是基于该方案,我会建议反对它。基本上你正在创建一个服务,让它在前台运行(猜测)你正在获取唤醒锁定只是为了在屏幕关闭时请求位置更新。这似乎有点矫枉过正。
有一种更有效的方法,它具有比Handler.postAtTime
或Handler.postDelayed
:AlarmManager.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