地理围栏转换 PendingIntent 被 Android Oreo 上的操作系统阻止

Posted

技术标签:

【中文标题】地理围栏转换 PendingIntent 被 Android Oreo 上的操作系统阻止【英文标题】:Geofence transition PendingIntent blocked by the OS on Android Oreo 【发布时间】:2018-04-06 16:54:07 【问题描述】:

这只发生在 android Oreo 上。我正在使用播放服务 11.4.2。 我正在使用 GeofencingClient 和 addGeofences 方法将地理围栏注册到一个处理地理围栏转换的 IntentService 的 pendingIntent。 看起来播放服务发送的意图在某些情况下被操作系统阻止了。

系统记录以下内容:

Background start not allowed: service Intent  cmp=my.app.id/my.package.struct.GeofenceTransIntentService (has extras)  to my.app.id/my.package.struct.GeofenceTransIntentService from pid=-1 uid=10154 pkg=my.app.id

在以下情况下添加地理围栏后:

当我在设备启动后添加它时 当我在应用程序被刷卡后添加它时 在这两种情况下,应用程序实际上已经在后台运行(因为我能够运行添加地理围栏的代码),因为我会监听 PROVIDERS_CHANGED、BOOT_COMPLETED。

【问题讨论】:

你能告诉我们你正在使用的代码吗? 【参考方案1】:

这是由新的Android Oreo background service limitations 引起的。

您必须将 PendingIntent 从使用 Service 更改为使用 BroadcastReceiver

有关更多信息和示例代码,请参阅此CodeLab。

【讨论】:

我刚切换到广播接收器,它工作了!非常感谢。 这个例子是关于位置更新,而不是关于 geofeces。此外,developers.google.com/android/reference/com/google/android/gms/… 上的第一条评论是“此接口已被弃用”。有没有更好的 Android Oreo 的 GeofenceAPI 代码示例? 有关如何在 Android O 及更高版本上处理此问题的更多详细信息,请参阅my answer to a related question。【参考方案2】:

除了在接受的答案中提到的切换到广播接收器之外,我想指出,虽然您仍然会收到 BOOT_COMPLETED,但您将无法再收到 PROVIDERS_CHANGED。

PROVIDERS_CHANGED 是隐式广播,不在broadcast exceptions 的列表中。

BOOT_COMPLETED 位于广播例外列表中,这就是您仍会收到它的原因。

如果您想了解在切换位置服务时获取钩子的替代方法,请参阅my answer to a related question 了解更多详情。

【讨论】:

以上是关于地理围栏转换 PendingIntent 被 Android Oreo 上的操作系统阻止的主要内容,如果未能解决你的问题,请参考以下文章

带有附加功能的地理围栏 PendingIntent

应用程序死机时的地理围栏

onHandleWork 从未收到来自 pendingintent 地理围栏的意图

Android 地理围栏是不是保持活动状态直到删除/过期或仅在我的 PendingIntent 启动之前

在 Android 12/API 31 中,地理围栏不适用于 IMMUTABLE 未决意图。为啥?

实施地理围栏 - 在应用程序未运行时接收地理围栏转换事件