Android Oreo (>25) 不再鼓励后台服务。我希望套接字在我的聊天应用程序中保持连接,即使应用程序关闭也是如此。 如何实现 android 26 的新变化?
有人说,用JobIntentService
有人说,用JobService
有人说,用JobScheduler
有人说,启动服务为前台服务
如有任何帮助,我们将不胜感激。
最佳答案
我在开发聊天应用程序时遇到了完全相同的问题,所以我知道您的痛苦。我们的结论是:
you don't keep a connection alive 24/7, if you need to deliver a message to an user that has no connection alive, send a push message via Firebase.
如果你想在后台保持连接存活,你会面临很多问题。第一个针对 Oreo,如果您的应用程序处于后台(在此上下文中“后台”的定义为 here ),则不允许运行,除非时间窗口很短。
你绝对可以使用 JobScheduler
来运行周期性任务,它们不会以精确的间隔或时间执行以减少电池使用(这很好)但它不会帮助你保持连接还活着。充其量,您可以使用 JobScheduler
定期从您的服务器拉取消息。为了使用 JobScheduler
,您需要创建一个 JobService
类。
JobIntentService
是支持库 API 26 中引入的新类。它是 IntentService
的替代品,它将在 android API 26+ 上作为 JobService
运行,并作为 Service
(类似于 IntentService
在某种意义上它会在后台线程中执行代码)在旧的 API 上。在 Oreo 上,它的后台执行仍然会受到限制,因此它不会帮助您保持连接。
使用前台 Service
确实可以帮助您降低进程被终止的可能性,但是,您需要显示永久通知。这听起来不像是聊天应用的好解决方案。
如果您仍然认为保持 24/7 连接是可行的选择,您还需要考虑 hibernate 模式。您可以要求用户将您的应用列入白名单,即使在打瞌睡模式下也能运行,但您应该有充分的理由这样做。同样,您将面临 Oreo 中的其他 bg 执行限制。
您将面临的另一个问题是其他应用。有些资源管理应用程序会主动杀死 bg 中的其他应用程序,以减少内存和电池使用量。比如我骂了this one相当多。
另一个问题是由 android 创建的。当系统内存不足时,它会开始杀死 bg 中的应用程序进程。有一个他们被杀死的顺序,如果我没记错的话应该考虑上次它在 fg 中的时间和当前的内存使用情况。这不是最糟糕的问题,但它仍然会发生。
那么,如果我仍然不能说服您放弃永久连接的想法,让我与您分享您将面临的另一个问题。一些供应商在终止 bg 进程时实现了非常激进的政策,因此它们的电池生命周期会更长。比如小米。
最后一个提示,无关紧要,但我们花了一段时间才弄清楚,所以我要分享它。如果用户强制从设置中停止您的应用程序,您的应用程序将死(即“停止状态”),直到用户主动再次启动它,它甚至不会收到 Firebase 推送消息。 p>
关于java - 建议我一些在 Android oreo 中保持 socket-io 连接的良好做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48899233/