由于线程在产生它们的活动的生命周期中仍然存在,因此我可以将需要执行的任何后台工作放在HandlerThreads上,例如不需要服务。当应用程序在后台绕过新的Oreo限制时,它们也将继续运行。
我在这里想念东西吗?
此外,自从引入打ze模式并增加了对Oreo的后台工作的更多限制以来,我到底应该在何时使用服务进行后台工作?除了 为将来的条件(例如WIFI连接或充电)安排任务,然后我将使用JobScheduler。即便如此,也可以通过BroadcastReceiver来处理...
答案 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
。