不幸的是,这方面有好坏两个消息。
坏消息是,自安卓6.0及以上版本开始,引入了待机模式的概念。如果设备闲置一段时间(无法确认具体时间长度,谷歌没有公开),设备将进入待机模式并暂停所有网络活动,只会出现短暂的维护窗口用于同步等操作。一个小的解决方法是不要针对API 23及以上的版本进行开发,但实际上我发现在某些手机上这种方法不起作用。另外一个可能规避此问题的方法是将您的应用添加到电池限制白名单中,但根据Google的指南,我认为您的应用不太可能符合资格。
更糟糕的消息是,从API 26开始,当应用完全处于后台且没有显示组件时(如通知或前台服务等),后台服务也将完全被挂起。因此,Oreo版本将更加困难。
好消息是,您可能并不需要持续保持套接字连接开启。相反,可以选择进行同步突发操作。我个人每30-60分钟运行一次任务来尝试同步。
您可以使用JobScheduler API,并且它会自动处理待机模式等内容,并在有网络连接时定期运行任务。当作业正在运行时,您可以连接到服务器,处理相关操作并关闭套接字。这是谷歌想要的,并且也在向所有开发人员推广的方法。
更新-2021年4月19日 WorkManager是应对待机模式和后台限制的新方法,也是最佳方式。
另一个选择是使用前台服务,并显示活动通知,通过套接字不断连接。这将对用户可见,不仅会让他们感到恼火,而且可能对电池造成损害。另外一种方法是使用作业调度程序定期运行前台服务,以保证透明性并定期同步数据。WhatsApp就是采用这种方式,他们有一个运行中的作业,定期将所有传入消息与前台服务同步。
简而言之:
您将无法始终保持其运行。您可以尝试使用我描述并了解的方法之一进行间歇性操作(也许还有其他替代方法,但我不知道,我已经测试过这些方法并且它们有效)。您将不得不做出妥协,抱歉。