Android Oreo 上的 OS 阻止了地理围栏转换 PendingIntent

Geofence transition PendingIntent blocked by the OS on Android Oreo

这只发生在 Android Oreo 上。我正在使用 Play 服务 11.4.2。 我正在使用 GeofencingClient 和带有 pendingIntent 的 addGeofences 方法向处理地理围栏转换的 IntentService 注册地理围栏。 看起来播放服务发送的意图在某些情况下被 OS 阻止。

系统记录如下:

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

一旦我在以下情况下添加地理围栏:

这是新的Android Oreo background service limitations造成的。

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

请参阅此 CodeLab 了解更多信息和示例代码。

除了已接受的答案中提到的切换到 BroadcastReceiver 之外,我想指出的是,尽管您仍然会收到 BOOT_COMPLETED,但您将无法收到 PROVIDERS_CHANGED不再。

PROVIDERS_CHANGED is an implicit broadcast and is not in the list of broadcast exceptions

BOOT_COMPLETED 在广播例外列表中,因此您仍会收到它。

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