java - 建议我一些在 Android oreo 中保持 socket-io 连接的良好做法

标签 java android

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/

相关文章:

java - Servlet 中的 session ID 管理

java - apache Camel 多播 - 以异步方式执行聚合

java - Google App Engine 中的版本号

java - 刷新 android ListView 的最佳方法是什么?

java - Genymotion 插件无法在 Eclipse 中显示

java - 声明一个扩展类并实现其他类的引用

java - 没有 Spring 的 Atomikos 事务管理器

android - onActivityResult 只调用一次

android - 禁用 SwipeRefreshLayout 拉动刷新的正确方法是什么

java - 区分多个附加的 gwt 小部件的事件