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

时间:2019-01-27 08:41:17

标签: android android-asynctask android-service android-jobscheduler android-intentservice

由于线程在产生它们的活动的生命周期中仍然存在,因此我可以将需要执行的任何后台工作放在HandlerThreads上,例如不需要服务。当应用程序在后台绕过新的Oreo限制时,它们也将继续运行。

我在这里想念东西吗?

此外,自从引入打ze模式并增加了对Oreo的后台工作的更多限制以来,我到底应该在何时使用服务进行后台工作?除了 为将来的条件(例如WIFI连接或充电)安排任务,然后我将使用JobScheduler。即便如此,也可以通过BroadcastReceiver来处理...

1 个答案:

答案 0 :(得分:1)

  

当后台运行的应用程序绕过新的Oreo限制时,它们还将继续运行。

那是不对的。的确,只要您的应用程序还活着,后台线程就会继续执行。问题是,您的应用程序可能会持续很长时间! Service用于向操作系统表示“我不想被拆毁;我还有要做的有用工作”。

来自docs

  

... [服务代表]是应用程序执行长时间运行的操作而不与用户交互的愿望,还是提供其他应用程序使用的功能。

  

这本身并不是在主线程上完成工作的手段

最终,当Android在决定是否保留您的App时,它并不在乎您正在运行的线程数,尚未完成的CountDownTimers数,{ {1}}您正在队列中等待,等等。它关心您是否有任何活动的应用程序组件。 Runnables是否可见?很好,坚持。 Activity开始了吗?也很棒以上都不是?也许是时候终止该应用了。

因此,这也回答了以下问题:“我什么时候应该使用服务进行后台工作?”如前所述,服务不会为您完成工作,只会帮助您保持生命。您可以尝试在Service中启动线程(请注意most implicit broadcasts no longer work post-Oreo),但是一旦您从BroadcastReceiver返回,则您的应用很可能会被杀死-除非您有服务也要继续。

附加的OREO后洞

请注意,onReceive()可能只会在应用程序离开前台(docs)之后帮助其保持“几分钟”的生命。我知道解决此问题的唯一方法是通过将您的Service设为“前景服务”来回到前台。

此外,如果需要确保设备在工作完成前保持苏醒状态,则需要在前台放置一个组件。也就是说,您仍然可以在“后台”(在“屏幕外”的意义上)进行该工作,但是您需要“前台服务”(操作栏中的图标)。否则,将应用“打ze”功能,这会禁止您的应用使用任何Service