FusedLocationProviderClient和唤醒锁

时间:2019-09-12 14:27:31

标签: android geolocation android-location android-wake-lock jobintentservice

我正在实施一种解决方案,以跟踪应用程序中前台和后台的位置更新,并在位置更新时执行一些任务。

根据https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient#requestLocationUpdates(com.google.android.gms.location.LocationRequest,%20android.app.PendingIntent)中的Google建议,我使用了requestLocationUpdates API的PendingIntent变体。

更改位置后执行任务的最佳方法是什么?

根据Google示例https://github.com/googlesamples/android-play-location/tree/master/LocationUpdatesPendingIntent,位置更改时要执行的任务是在广播接收器的onReceive()中完成的。这种方法不涉及唤醒锁和设备背景限制。

根据我对各种stackoverflow答案和不同博客的了解,我必须使用JobIntentService。

  1. 使用JobIntentService是符合我要求的正确方法

  2. 在位置更改,设备处于睡眠模式(我知道JobIntentService自动处理唤醒锁)时,应用程序是否需要获取唤醒锁才能执行任务。

  3. 当调用诸如BroadcastReceiver()的onlocationChanged(),onReceive()之类的系统回调时,当设备处于睡眠模式时,CPU是否自动唤醒。如果被唤醒,它将激活多少时间?它是否等待回调完成。

1 个答案:

答案 0 :(得分:1)

在Android源代码注释中找到了一些有用的信息

”当调用位置回调时,系统将保持唤醒锁 代表您的应用一段时间 无限期地如果您的应用程序需要长时间运行的唤醒锁 在位置回调中,您应该自己获取它。”

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/location/java/android/location/LocationManager.java

使用JobIntentService是符合我要求的正确方法

使用JobIntentService是正确的方法,  1.它可以处理唤醒锁,  2.由于Android“ O”及以上版本存在背景限制,因此可以在打do模式的Maitainance窗口中使用。

应用程序是否需要获取唤醒锁才能在位置更改,设备处于睡眠模式(我知道JobIntentService自动处理唤醒锁)时执行任务。

位置更改回调附带了唤醒锁,如果返回回调,则释放。对于回调中的任何冗长任务,都必须使用唤醒锁在回调中启动Service(JobIntentService将在此处提供帮助)。

当调用诸如BroadcastReceiver()的onlocationChanged(),onReceive()之类的系统回调时,当设备处于睡眠模式时,CPU是否自动唤醒。如果被唤醒,它将激活多少时间?它是否等待回调完成。

系统回调通常带有唤醒锁,并在返回回调时释放。当它们在UI主线程中运行时,必须完成的所有任务都必须移交给服务。为了即使在设备睡眠用例中也要运行服务,必须获取唤醒锁,并且JonIntentService再次在此处提供帮助。

JobIntentservice还以最佳方式处理打ze模式。

注意:由于后台位置的限制,要获取连续的位置更新,App必须启动前台服务。