建议我一些保持 Android Oreo 中 Socket.IO 连接的好方法。

10
自 Android Oreo (>25) 开始,不再鼓励使用后台服务。在我的聊天应用程序中,我希望套接字即使在应用程序关闭时仍然保持连接。 我该如何实现对 Android 26 的新更改?
有些人说,可以使用 JobIntentService。
有些人说,可以使用 JobService。
有些人说,可以使用 JobScheduler。
有些人说,将服务作为前台服务启动。
感谢任何帮助。

我也很久以前就在寻找这种解决方案,就像 WhatsApp 一样,他们到底使用了什么。 - user3164401
有没有可能从另一个角度来看待这个问题?真的有必要保持套接字连接吗?你希望实现什么样的行为? - Eduardo Naveda
2
嗯,我不太了解您的服务器端,但是是否有任何阻止您在向该用户发送消息并关闭连接时向另一台设备发送推送通知的东西呢?这样,用户只需再次打开应用程序,就可以重新创建连接,因此消息可以再次以正常方式发送。我认为今天的首要任务是尽力避免始终保持连接。无论目标API级别如何,这都可能对电池健康造成不良影响。 - Eduardo Naveda
1
你想在应用关闭后永久保持它的活动状态吗?我建议重新定义你的使用情况。 - Sarthak Mittal
1
做许多消息应用程序所做的事情:推送通知,Firebase 提供了该服务。 - from56
显示剩余3条评论
2个回答

17

我曾经在一个聊天应用程序上遇到了完全相同的问题,所以我知道你的痛苦。我们的结论是:

如果您需要向没有活动连接的用户传递消息,请通过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推送消息。


我有一个叫车应用,我别无选择,只能在后台维护套接字连接。我应该使用什么? - Mohsin Falak
@MohsinFalak 我会选择前台服务。 - lelloman
我已经禁用了前台服务、唤醒锁和电池优化,但仍然存在断开连接的问题,因为中国设备有其自定义的电池功能。我必须手动进入这些设备的设置中,为我的应用程序启用后台访问权限。然后它就可以正常工作了。 https://dontkillmyapp.com所以我的问题是,WorkManager 是否能够解决我的情况? - Mohsin Falak
@MohsinFalak 我认为使用工作管理器,你可以安排一个轮询机制来代替保持连接开放。 - lelloman
我的用例不允许我停止连接。为了使其能够被指定一个行程,我需要司机的实时可用性。(或者您是否有其他建议?)我的真正问题是,相比于使用: 前台服务、唤醒锁和禁用电池优化,工作管理器有哪些优势? - Mohsin Falak
@MohsinFalak 我不确定,如果我没记错的话,工作管理器并不是为了不惜一切代价让你的应用程序保持活动状态,而是为了让你的应用程序执行定义好的后台任务。你可以尝试使用长时间运行的工作程序,看看它是否最终会被杀死。 - lelloman

5
如果您的服务器配置在XMPP上,那么这对您来说将是很容易的。 实际上,并不需要始终保持套接字连接。这对电池来说非常昂贵,我相信您不希望出现这种情况。
案例:您正在开发一个消息应用程序。
如果您的套接字断开连接,那么客户端将以Google FIREBASE通知的形式接收到消息。当您的客户端从Firebase接收到通知时,只需启用套接字,您就可以重新开始工作了。 我建议您使用XMPP的原因是因为XMPP维护未传递/离线消息的队列。当您的套接字再次连接时,只需从服务器拉取离线消息即可。
我不认为这会对您有所帮助,但这可能为您提供另一个想法的空间。

我有一个打车应用程序,我别无选择,只能在后台维护套接字连接。我应该使用什么? - Mohsin Falak
你需要实现VOIP来让你的应用在后台运行服务,即使用户关闭了应用(而不是杀死)。 - Daksh Gargas
你的意思是我需要欺骗系统,让它认为我正在进行VOIP通话吗? 你能详细说明一下吗? - Mohsin Falak
我目前有一个前台服务,唤醒锁和电池优化已禁用。该应用在Pixel设备上运行完美!但是,在中国设备上,我必须手动进入设置并启用“允许后台”才能正常运行。 - Mohsin Falak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接