我正在实现一个解决方案来跟踪我的应用程序中的位置更新,包括前台和后台,并且在位置更新时执行一些任务。
根据https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient#requestLocationUpdates(com.google.android.gms.location.LocationRequest,%20android.app.PendingIntent)中的谷歌建议,我使用了requestLocationUpdates API的PendingIntent变体。
当位置发生变化时,执行任务的最佳方法是什么?
根据Google https://github.com/googlesamples/android-play-location/tree/master/LocationUpdatesPendingIntent,位置变化时要执行的任务是在广播接收器的onReceive()中完成的。这种方法不处理唤醒和设备背景限制。
根据我的理解,在浏览了各种堆栈溢出答案和不同的博客之后,我必须使用JobIntentService。
发布于 2019-09-12 15:04:51
在Android源代码注释中找到一些有用的信息
“当调用位置回调时,系统将在一段时间内代表您的应用程序保存一个唤醒锁,但不是无限期的。如果您的应用程序需要在位置回调中运行一个长时间的唤醒,您应该自己获取它。”
正在使用JobIntentService是我的需求的正确方法
使用JobIntentService将是正确的方法,1。它可以处理唤醒,2。由于Android "O“及以上版本都有背景限制,所以它可以在打瞌睡模式的Maitainance窗口工作。
当设备处于睡眠模式(我知道会自动处理唤醒)时,当位置发生变化时,JobIntentService确实需要获取唤醒锁来执行任务。
如果返回回调,则位置更改回调会随已获得的唤醒而来,并且会丢失。对于回调中的任何冗长任务,服务必须在带唤醒的回调中启动(JobIntentService在这里会有所帮助)。
当调用系统回调(如onlocationChanged()、BroadcastReceiver()的onReceive() )时,当设备处于睡眠模式时,CPU会自动唤醒。如果被唤醒,它会激活多少时间?它是否等待回调完成.
系统回调通常伴随着获取的唤醒,并在回调返回时释放。当它们在UI主线程中运行时,任何要完成的任务都必须卸载到服务中。对于即使在设备睡眠中运行的服务,也必须获得唤醒,而且JonIntentService也在这里提供帮助。
JobIntentservice还以最好的方式处理打瞌睡模式。
注意:由于背景位置的限制,要获得连续的位置更新,App必须启动前台服务。
https://stackoverflow.com/questions/57908911
复制相似问题