FusedLocationProviderClient 和唤醒锁

Posted

技术标签:

【中文标题】FusedLocationProviderClient 和唤醒锁【英文标题】:FusedLocationProviderClient and Wakelocks 【发布时间】:2020-01-14 11:04:14 【问题描述】:

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

根据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() 中完成。这种方法不处理唤醒锁和设备后台限制。

根据我在浏览各种***答案和不同博客后的理解,我必须使用JobIntentService。

    使用 JobIntentService 是满足我要求的正确方法

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

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

【问题讨论】:

【参考方案1】:

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

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

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

使用 JobIntentService 是满足我要求的正确方法

使用 JobIntentService 是正确的方法, 1.它可以处理唤醒锁, 2.由于Android“O”及以上版本有后台限制,可以在打盹模式的维护窗口下工作。

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

位置更改回调随唤醒锁一起获取,如果回调返回则松动。对于回调中的任何冗长任务,必须使用唤醒锁在回调中启动服务(JobIntentService 将在此处有所帮助)。

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

系统回调通常伴随着获取唤醒锁,并在回调返回时释放。当它们在 UI 主线程中运行时,任何要完成的任务都必须卸载到服务中。为了使服务即使在设备睡眠用例中也能运行,必须获取唤醒锁,而 JonIntentService 在这里再次提供帮助。

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

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

【讨论】:

以上是关于FusedLocationProviderClient 和唤醒锁的主要内容,如果未能解决你的问题,请参考以下文章