代码之家  ›  专栏  ›  技术社区  ›  Mena

多线程vs服务的典型用例是什么?

  •  0
  • Mena  · 技术社区  · 6 年前

    由于线程在产生它们的活动的生命周期中一直存在,所以我可以将我需要做的任何后台工作放到handlerThreads上,例如,不需要服务。此外,当应用程序在后台绕过新的oreo限制时,它们将继续运行。

    我是不是错过了什么?

    而且,自从引入了Doze模式和对后台工作启动oreo添加了更多限制之后,我应该在什么时候使用服务来做后台工作?除了 为将来的情况安排任务,如WiFi连接或充电,然后我将使用JobScheduler。但即使是通过广播接收器也能处理…

    1 回复  |  直到 6 年前
        1
  •  1
  •   greeble31    6 年前

    此外,当应用程序在后台绕过新的oreo限制时,它们将继续运行。

    那不太对。事实上,只要你的应用还活着,后台线程就会继续执行下去。问题是,您的应用程序可能不会运行很长时间!A Service 用于向操作系统指示“我不想被拆散;我还有一些有用的工作要做”。

    docs :

    …[服务表示]应用程序希望在不与用户交互的情况下执行较长的运行操作,或者为其他应用程序提供要使用的功能。

    它本身并不是一种脱离主线程的工作方式。

    最终,当Android决定是否保留你的应用程序时,它不关心你运行的线程数量,以及 CountDownTimers 还没完成,多少? Runnables 您在队列中等待,等等。它关心您是否有任何活动的应用程序组件。是一个 Activity 可见的?太好了,留下来。是一个 服务 起动?也很棒。以上都不是?也许是时候终止应用了。

    所以这也回答了一个问题,“我应该在什么时候使用一个服务来做后台工作?”如前所述,服务不会为您完成工作,它只会帮助您保持活力。你可以试着在 BroadcastReceiver (注意 most implicit broadcasts no longer work post-Oreo ,但你一回来 onReceive() ,你的应用程序很可能会被杀——除非你也有一个服务。

    其他术后注意事项

    注意,A 服务 可能只会在应用离开前台后帮助你的应用保持“几分钟”的活动状态( docs )我知道的唯一绕过这个的方法是通过使你的 服务 “前台服务”。

    此外,如果需要确保设备在完成工作之前保持唤醒状态,则需要在前景中有一个组件。也就是说,你仍然可以在“后台”(在“非屏幕”的意义上),但你需要一个“前台服务”(在操作栏中的图标)。否则,会打瞌睡,这会抑制 WakeLocks 您的应用程序正在使用。