多线程与服务的典型用例是啥?
Posted
技术标签:
【中文标题】多线程与服务的典型用例是啥?【英文标题】:What are typical use cases for multithreading vs services?多线程与服务的典型用例是什么? 【发布时间】:2019-06-20 12:53:11 【问题描述】:由于线程在产生它们的活动的生命周期之后仍然存在,因此我可以将我需要做的任何后台工作放在 HandlerThreads 上,例如,不需要服务。此外,当应用程序在后台绕过新的奥利奥限制时,它们将继续运行。
我错过了什么吗?
另外,自从引入打盹模式以及对启动 Oreo 的后台工作增加了更多限制后,我究竟应该何时使用服务来做后台工作?除了 为将来的条件安排任务,例如 WIFI 连接或充电,然后我会使用 JobScheduler。但即使这样也可以通过 BroadcastReceiver 来处理...
【问题讨论】:
【参考方案1】:当应用在后台绕过新的奥利奥限制时,它们将继续运行。
这不太对。确实,只要您的应用程序还活着,后台线程就会继续执行。问题是,您的应用程序可能不会存活很长时间! Service
用于向操作系统表明,“我不想被拆毁;我还有有用的工作要做”。
来自docs:
...[服务代表]应用程序希望在不与用户交互的情况下执行更长时间运行的操作,或提供功能供其他应用程序使用。
和
它本身并不是一种脱离主线程的方法
最终,当android决定是否保留您的应用程序时,它并不关心您正在运行的线程数,尚未完成的CountDownTimers
数量,有多少Runnables
您在队列中等待,等等。它关心您是否有任何活动的应用程序组件。 Activity
是否可见?太好了,坚持。 Service
开始了吗?也很棒。以上都不是?也许是时候终止应用了。
所以这也回答了这个问题,“我应该什么时候使用服务来做后台工作?”如前所述,服务不会为您完成工作,它只会帮助您保持活力。您可以尝试在BroadcastReceiver
中启动一个线程(注意most implicit broadcasts no longer work post-Oreo),但是一旦您从onReceive()
返回,您的应用程序很可能会被杀死——除非您也有一个Service 正在运行。
其他 OREO 后注意事项
请注意,Service
可能只会在应用离开前台 (docs) 后帮助您的应用在“几分钟”内保持活动状态。我知道解决此问题的唯一方法是通过将您的 Service
设为“前台服务”来回到前台。
此外,如果您需要确保设备在工作完成之前保持唤醒状态,则需要在前台安装一个组件。也就是说,您仍然可以在“后台”(在“屏幕外”的意义上)进行这项工作,但您需要一个“前台服务”(操作栏中的图标)。否则,Doze 将适用,这往往会阻止您的应用正在使用的任何 WakeLocks
。
【讨论】:
以上是关于多线程与服务的典型用例是啥?的主要内容,如果未能解决你的问题,请参考以下文章