对前台服务使用 Context.startForegroundService(Intent) 而不是 Context.startService(Intent) 有什么好处吗?
Are there any benefits to using Context.startForegroundService(Intent) instead of Context.startService(Intent) for foreground services?
我在 the docs 中读到 Context.startForegroundService()
隐含承诺启动的服务将调用 startForeground()
。然而,由于 Android O 正在对后台和前台服务进行更改,与使用旧的 startService()
方法相比,它是否有任何其他性能改进,或者它只是未来的最佳实践?
它既不是关于性能改进,也不是收益,也不是最佳实践。
从API26开始,系统不允许后台应用创建后台服务。
因此,如果您的应用程序在后台(如果它也在前台,欢迎您这样做),您必须 使用 Context.startForegroundService(Intent)
代替之前的 startService(Intent)
。服务必须在启动后的前 5 秒内调用 startForeground(int, Notification)
,否则系统将停止服务。
还应该提到的是,有信息表明从后台应用程序使用 startService(Intent)
启动服务的旧方法在当前版本的 Android Oreo 上仍然有效,但它将是很快修复。
因此,从 API 26 开始,无论何时要启动前台服务,您都希望使用新的 Context.startForegroundService(Intent)
方法而不是 startService(Intent)
。
正如我所解释的 here, startForegroundService has a serious problem that will inevitably lead to infrequent ANR's. Since this problem can't be fixed at an app level, startForegroundService should not be used. I switched to JobScheduler and JobService 模型来实现相同的功能。
后一种模式到目前为止运行良好,我再也没有在 Play 商店中看到应用程序崩溃。虽然新模型非常不同,但我已经花了两天时间 re-factoring 基于 startForegroundService 的现有代码,但它确实得到了回报。
我在 the docs 中读到 Context.startForegroundService()
隐含承诺启动的服务将调用 startForeground()
。然而,由于 Android O 正在对后台和前台服务进行更改,与使用旧的 startService()
方法相比,它是否有任何其他性能改进,或者它只是未来的最佳实践?
它既不是关于性能改进,也不是收益,也不是最佳实践。
从API26开始,系统不允许后台应用创建后台服务。
因此,如果您的应用程序在后台(如果它也在前台,欢迎您这样做),您必须 使用 Context.startForegroundService(Intent)
代替之前的 startService(Intent)
。服务必须在启动后的前 5 秒内调用 startForeground(int, Notification)
,否则系统将停止服务。
还应该提到的是,有信息表明从后台应用程序使用 startService(Intent)
启动服务的旧方法在当前版本的 Android Oreo 上仍然有效,但它将是很快修复。
因此,从 API 26 开始,无论何时要启动前台服务,您都希望使用新的 Context.startForegroundService(Intent)
方法而不是 startService(Intent)
。
正如我所解释的 here, startForegroundService has a serious problem that will inevitably lead to infrequent ANR's. Since this problem can't be fixed at an app level, startForegroundService should not be used. I switched to JobScheduler and JobService 模型来实现相同的功能。
后一种模式到目前为止运行良好,我再也没有在 Play 商店中看到应用程序崩溃。虽然新模型非常不同,但我已经花了两天时间 re-factoring 基于 startForegroundService 的现有代码,但它确实得到了回报。