2

这只发生在 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。
4

2 回答 2

10

这是由新的Android Oreo 后台服务限制造成的。

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

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

于 2017-10-27T08:46:37.063 回答
1

除了如已接受的答案中提到的那样切换到广播接收器之外,我想指出,尽管您仍会收到 BOOT_COMPLETED,但您将无法再收到 PROVIDERS_CHANGED。

PROVIDERS_CHANGED是隐式广播,不在广播例外列表中。

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

如果您想了解在切换位置服务时获取钩子的替代方法,请参阅我对相关问题的回答以获取更多详细信息。

于 2018-09-07T19:35:42.333 回答