Android Oreo(> 25)不再鼓励后台服务。即使应用程序关闭,我希望套接字在聊天应用程序中保持连接状态。 如何实现对android 26的新更改?
有些人说,使用 JobIntentService
有些人说,使用 JobService
有些人说,使用 JobScheduler
有些人说,开始服务为前台服务
任何帮助都将不胜感激。
答案 0 :(得分:11)
我在聊天应用程序上遇到了完全相同的问题,所以我知道你的痛苦。我们的结论是:
如果您需要提供服务,请不要每周7天,每天24小时保持联系 向没有连接的用户发送消息,发送推送消息 通过Firebase。
如果你想在后台保持连接活动,你将面临很多问题。第一个针对Oreo的是,如果您的应用处于后台(定义为"背景"在此上下文中为here),除了很短的时间外,它不会被允许运行窗户。
你绝对可以使用JobScheduler
来执行定期任务,他们不会在确切的时间间隔或时间执行以减少电池使用量(这很好),但它不会帮助你保持一个活着的联系。充其量,您可以使用JobScheduler
定期从您的服务器提取消息。要使用JobScheduler
,您需要创建一个JobService
类。
JobIntentService
是支持库API 26中引入的新类。它是IntentService
的替代品,它将在Android API 26+上作为JobService
运行,并作为Service
运行(类似于IntentService
,因为它将执行代码在较旧的API上的后台线程中。在奥利奥,它的背景执行仍然有限,所以它不会帮助你保持连接活着。
使用前景Service
可以真正帮助您降低进程被杀的可能性,但是,您需要显示永久通知。对于聊天应用来说,这听起来不是一个好的解决方案。
如果你仍然认为拥有24/7连接是可行的选择,你还需要考虑打盹模式。您可以要求用户将您的应用程序列入白名单,即使在打盹模式下也可以运行,但您应该有充分的理由这样做。再次,您将面对Oreo中的其他bg执行限制。
您将面临的另一个问题是其他应用。有资源管理应用程序将积极杀死bg中的其他应用程序,以减少内存和电池使用。例如,我诅咒了this one。
另一个问题是由 android 创建的。当系统内存不足时,它将开始终止bg中的应用程序进程。如果我没记错的话,有一个命令可以将它们杀死,应该考虑上次使用fg和当前内存时的情况。不是最严重的问题,但仍然会发生。
然后,如果我仍然没有说服你放弃永久联系的想法,那么让我与你分享你将面临的另一个问题。一些供应商在杀死bg进程时实施极具侵略性的策略,因此他们的电池续航时间会更长。例如,小米。
最后提示,无关,但我们需要一段时间来解决这个问题,所以我要分享它。如果用户强制停止您的应用设置,则您的应用 dead (即"停止状态"),直到用户再次主动启动它,它甚至不会接收Firebase推送消息。
答案 1 :(得分:3)