有些人说,可以使用 JobIntentService。
有些人说,可以使用 JobService。
有些人说,可以使用 JobScheduler。
有些人说,将服务作为前台服务启动。
感谢任何帮助。
我曾经在一个聊天应用程序上遇到了完全相同的问题,所以我知道你的痛苦。我们的结论是:
如果您需要向没有活动连接的用户传递消息,请通过Firebase发送推送消息,而不要保持24/7的连接。
如果您想在后台保持连接,则会遇到许多问题。首先,在针对Oreo版本时,如果您的应用程序处于后台(在这种情况下,“后台”的定义在此处),除了一些小时间窗口外,它将不被允许运行。
您可以使用JobScheduler
来运行定期任务,但它们不会在准确的时间间隔或时间点执行,以降低电池使用量(这很好),但它无法帮助您保持连接处于活动状态。最好的情况是,您可以使用JobScheduler
从服务器定期拉取消息。为了使用JobScheduler
,您需要创建一个JobService
类。
JobIntentService
是在支持库API 26中引入的新类。它是IntentService
的替代品,在Android API 26+上将作为JobService
运行,在旧版API上将作为Service
运行(类似于IntentService
,它将在后台线程中执行代码)。在Oreo上,它的后台执行仍然受到限制,因此它无法帮助您保持连接处于活动状态。
使用前台Service
确实可以帮助您减少进程被终止的可能性,但您需要显示一个永久通知。对于聊天应用程序来说,这听起来不是一个好的解决方案。
如果你仍然认为24/7连接是可行的选择,那么你需要考虑到省电模式。你可以请求用户将你的应用程序添加到省电模式白名单中,但你必须有充分的理由这样做。同样,你将面临Oreo系统中的其他后台执行限制。
另一个问题是其他应用。有资源管理应用程序会积极杀死后台运行的其他应用程序以减少内存和电池使用。例如,我非常讨厌这个应用。
Android也会导致另一个问题。当系统内存不足时,它会开始终止后台应用程序的进程。它们被终止的顺序应该考虑上次进入前台的时间和当前的内存使用情况。这并不是最糟糕的问题,但确实会发生。
如果我还没有说服你放弃永久连接的想法,那么让我向你介绍另一个你将面临的问题。一些供应商在终止后台进程时采取了极其激进的策略,使他们的电池寿命更长。例如,小米。
最后一个提示,与上述内容无关,但是我们花了一段时间才弄清楚,所以我将分享它。如果用户在设置中强制停止你的应用程序,那么你的应用程序将处于停止状态,直到用户再次主动启动它,甚至不会接收Firebase推送消息。