【发布时间】:2017-09-01 06:26:41
【问题描述】:
因此,对于 Android O,如果您希望每小时接收的不仅仅是几个位置更新,您需要让您的服务作为前台服务运行。
我注意到启动前台服务的旧方法似乎确实适用于 O。 即
startForeground(NOTIFICATION_ID, getNotification());
根据此处的行为更改指南: https://developer.android.com/preview/behavior-changes.html
NotificationManager.startServiceInForeground() 方法启动前台服务。启动前台服务的旧方法不再有效。
虽然新方法仅在针对 O 时有效,但旧方法似乎仍然适用于 O 设备,无论是否针对 O。
编辑 包括例子:
Google 示例项目 LocationUpdatesForegroundService 实际上有一个工作示例,您可以在其中直接看到问题。 https://github.com/googlesamples/android-play-location/tree/master/LocationUpdatesForegroundService
startForeground 方法似乎可以正常工作,无论是针对 API 级别 25 进行定位和编译,还是针对 O 进行定位和编译(如下所示:https://developer.android.com/preview/migration.html#uya)
所以,要重现:
- 按照上一个链接中的说明配置应用 gradle
- 打开应用
- 请求位置更新
- 关闭应用程序(通过返回按钮或主页按钮)
服务正在前台运行(由通知阴影中的图标显示)。即使在运行 O 的设备上,位置更新也会按预期进行(每 10 秒一次)。我在这里缺少什么?
【问题讨论】:
-
我对@987654324@ 的解释是,使用
startServiceinForeground()的风险较小,以防您处于后台并且即将失去启动后台服务的能力。 -
从阅读developer.android.com/preview/behavior-changes.html#abll 部分可以看出,在前台启动服务在 Android O 中根本不起作用(至少在定位它时)。尽管文档中有这句话,但我很惊讶地看到它仍然有效。那么,如果一个应用保持目标 SDK
-
最好没问题,否则很多应用会崩溃。
-
是的,我就是这么想的。但也有人认为,这可能是 Google 采取的一种“将它们从水中吹走”的方法,以防止用户的电池被执行后台操作和耗尽电池的应用程序破坏。
-
认为他们自 ODP1 以来更改了 API。不过要小心。他们似乎没有更新所有文档。 developer.android.com/about/versions/oreo/…
标签: android location android-8.0-oreo