【发布时间】:2020-06-05 17:28:04
【问题描述】:
我读到我应该打电话给
startForegroundService(intent)
如果我想正确启动可以作为前台服务运行的服务。但是,如果我希望它在不作为前台服务但以后可能成为前台服务的情况下启动,我应该怎么想?关于我们现在如何拥有它的一些信息:
我们有一个应用程序,它使用一项服务来完成许多任务。当用户在前台与应用程序交互时,它会执行所有这些任务,但取决于用户是否启用了某个功能,我们希望继续在后台执行这些任务。因此,当应用程序启动时(显然是在前台),我们使用
启动服务startService(intent);
当应用程序转换到后台时,我们会检查该功能是否已启用,如果已启用,则运行 startForeground(id, notificiation);,这会有效地将不可移除的通知添加到操作系统中,并且服务会继续运行。当应用程序回到前台时,我们调用stopForeground(true)。如果未启用该功能,该服务将永远不会设置为前台服务,我们也不会尝试在后台执行这些任务。
所以我的问题是:这足以获得“完整的前台服务性能”吗?还是因为不打电话给startForegroundService(intent)而失去了一些东西?我的印象是,我们确实有一个完全正常工作的前台服务,但是当我读到 foreground services must be started using startForegroundService(intent) 我们没有做的声明时,我感到很困惑。如果我们真的需要使用startForegroundService(intent),我能想到的唯一解决方案是首先启动一个普通的服务实例,当应用程序进入后台时,我们使用startForegroundService(intent)启动一个新实例.但是我们需要这样做还是在使用startService(intent) 启动的服务上运行startForegund(id, notification) 足以实现前台服务?
注意: 我发现的一个区别是,如果应用程序本身在后台启动服务时,我需要 startForegroundService(intent) 用于 API >= 26。在我们的例子中,我们总是在以下时间启动服务该应用程序在前台。但是,我确实记得在某些情况下,当我们尝试使用 startService(intent) 启动服务时,我看到了抛出异常,不知何故,应用程序(非常罕见)仍然认为它在后台(也许当应用程序出现时来自操作系统的某些东西已启动)。因此,如果我发现这种情况发生时,我可以运行startForegroundService(intent) 来启动服务。但是当应用程序回到前台时,是否可以在该服务上运行stopForeground(true)?或者,自从我们以这种方式启动它之后,它就注定永远是前台服务吗?
【问题讨论】:
-
我想你的答案是here。他们在 Android O 中添加了很多限制。运行长寿服务的唯一方法是在前台启动,否则,操作系统会杀死它们或抛出异常
-
是的,但是当应用程序处于前台时,我们使用
startService(intent)启动后台服务,这仍然是允许的。然后,当应用程序进入后台时,我们使用startForeground(id, notification)将其设置为前台。所以这并不能真正回答任何问题。如果应用程序在前台并且我运行startService(intent)后跟startForeground(id, notification),这与运行startForegroundService(intent)后跟startForeground(id, notification)会有任何不同吗?
标签: android service foreground