android - 服务未重新启动
问题描述
我们在 Android 8.1 及更高版本中偶然发现了一个我们以前从未见过的问题,不幸的是,这使我们的应用对用户来说不太方便。Android 8.1 及更高版本中的后台粘性服务不会在用户滑动杀死应用程序时重新启动。
在 Android 8.0 及更低版本中,服务始终在后台可用,特别是对于实现为“粘性服务”的服务,有很高的承诺。
综上所述,在最近的应用列表中刷杀时,非粘性服务不会重新启动。对于粘性服务(应用程序与服务一起托管),应用程序会在终止后不久重新启动。前台服务应用程序实际上永远不会被杀死,即使在滑动杀死期间也是如此。
这在 Android 8.0 及之前的版本中可以正常工作。因此,在一次 kill swipe 之后,应用进程会在短时间内重新创建,然后调用 onCreate 和 onStartCommand,再次完全启动服务。
但从 Android 8.1 开始,省略了 onStartCommand 调用。因此,我们没有得到 onCreate 和 OnStartCommand,而是得到了 onCreate 和 OnDestroy。这实际上不会使服务再次激活。不用说,我们也不能手动启动我们自己的服务onCreate
。
我认为下面的文章非常清楚地展示了非粘性服务、粘性服务和前台服务之间的差异(以及功能代码)。
在 Android 8.1 及更高版本中,省略了 onStartCommand 调用(因此不会重新启动服务)。因此,我们在重新创建应用程序期间获取 onCreate 和 OnDestroy,而不是获取 onCreate 和 OnStartCommand。
此外,我们不希望始终在顶部有一个可见的应用程序图标(如使用 setForeground 服务时),而是让它在后台工作而不会过多地打扰用户。
解决方案
不要优化电池可能会使您的服务正常运行您也可以使用AlarmManager在固定时间后重新启动服务
它可以帮助点击
推荐阅读
- c# - 段落列表不包含全部内容
- javascript - 电话号码验证正则表达式
- c# - Quartz C# 每小时运行一次
- python - 没有名为“pynput”的模块
- android - 无法解决 React-native 中的 TransformError
- java - Spring注入XML未编组实体
- javascript - Electron:带有表单的对话框消息框
- json - 甲骨文 PLSQL 11g;将大型 JSON 对象存储为 CLOB(缓冲区在 122k 字符时太小)
- swift - 如何快速过滤具有多个键的nsdictionary?
- javascript - 当一个部分使用 Vanilla JS 触及视口顶部时,如何触发函数?