Android API 30 及更高级别在后台获取 GPS 位置的最佳方式

Posted

技术标签:

【中文标题】Android API 30 及更高级别在后台获取 GPS 位置的最佳方式【英文标题】:Best way get GPS Location in background for Android API level 30 and higher 【发布时间】:2021-03-11 22:11:52 【问题描述】:

我的应用程序根据用户的位置确定速度限制,并告诉用户他是否超过了它。 从 android API 级别 30 及更高级别开始,Google 已将 IntentService 定义为deprecated,并建议使用WorkManager 或JobIntentService,并声明必须从Firebase JobDispatcher 迁移到WorkManager。我看到了解决这个问题的两种方法:

    启动OneTimeWorkRequest,并指定在应用程序在后台运行时在此方法中定期重启此方法。 运行PeriodicWorkRequest,最小允许间隔为 15 分钟。在这个方法中,运行JobIntentService方法,runs for up to about 10 minutes,但是该方法可能没有运行,或者可能在完成之前被系统销毁。

我很担心:

潜在的内存泄漏; WorkManager 或 JobIntentService 在从前台转到后台(反之亦然)时可能出现问题 能够使用 MVVM 模式

【问题讨论】:

【参考方案1】:

我更喜欢使用第二个选项,它可以让您在每次重新安排 Worker 之间有更多时间。

关于您的担忧:

唯一可能的泄漏是位置回调不当。这很容易找到,您不必太担心。 计划的Worker 被放入数据库并独立于应用程序执行。这意味着,应用程序的用户可见性没有任何影响。在您的情况下,我假设您想在用户恢复应用程序后取消您的计划工作,也就是说您可以将 tag 分配给 Worker 并清除用户可见的任何计划或正在进行的工作。 我更喜欢将Workers 与 MVVM 隔离,只在工作程序中注入用例/交互器并执行用例/查询交互器。 WorkerManager 提供了很好的 API 来查询 Worker 状态,您可能需要在之前的实现和 API >= 30 之间编写共同点。将 Worker 视为您用例的不同执行容器。

【讨论】:

以上是关于Android API 30 及更高级别在后台获取 GPS 位置的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

如何定位多个 API 级别?

Android Edittext 不能专注于 API 22(代码在 API 23 及更高版本上运行良好)

根据 API 级别隐藏应用小部件

如何使用 Target API 23 及更高版本通过 GPS 获取用户位置

使用 API 8 及更高版本获取用户/所有者个人资料联系人 URI 和用户图像

android M 之前的运行时权限(api 14 及更高版本)