草庐IT

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

coder 2023-11-23 原文

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 - 建议我一些在 Android oreo 中保持 socket-io 连接的良好做法的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  10. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

随机推荐