多线程与服务的典型用例是什么?
What are typical use cases for multithreading vs services?
由于线程在生成它们的 activity 的生命周期之后仍然存在,我可以将我需要做的任何后台工作放在 HandlerThreads 上,例如,不需要服务。此外,当应用程序在后台绕过新的 Oreo 限制时,他们将保留 运行。
我是不是漏掉了什么?
此外,自从引入 Doze 模式以及从 Oreo 开始对后台工作增加更多限制后,我到底应该在什么时候使用服务来进行后台工作?除了
为未来条件(例如 WIFI 连接或充电)安排任务,然后我会使用 JobScheduler。但即使这样也可以通过 BroadcastReceiver 处理...
Also they will keep running when the app in in the background bypassing the new Oreo restrictions.
这不太正确。的确,只要您的应用程序处于活动状态,后台线程就会继续执行。问题是,您的应用程序可能不会存活很长时间! Service
用于向操作系统指示,"I don't want to get torn down; I still have useful work I have to do".
来自docs:
...[A Service represents] either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.
和
It is not a means itself to do work off of the main thread
最终,当 Android 决定是否保留您的 App 时,它并不关心您拥有的线程数 运行、CountDownTimers
的线程数还没有完成,有多少 Runnables
你在队列中等待等等。它关心你是否有任何活动的应用程序组件。 Activity
可见吗?太好了,留下来。 Service
开始了吗?也很棒。 None 以上?也许是时候终止应用程序了。
所以这也回答了问题,"when exactly should I use a service to do background work?" 如前所述,服务不会为您完成工作,它只会帮助您生存。您可以尝试在 BroadcastReceiver
中启动一个线程(注意 most implicit broadcasts no longer work post-Oreo),但是一旦您从 onReceive()
中 return,您的应用程序很可能会被杀死 - - 除非你也有服务。
额外的POST-奥利奥注意事项
请注意,Service
可能只会帮助您的应用在离开前台 (docs) 后存活 "several minutes"。我知道解决这个问题的唯一方法是让你的 Service
成为 "foreground service."
回到前台
此外,如果您需要确保设备在您的工作完成之前保持唤醒状态,则需要在前台安装一个组件。也就是说,您仍然可以在 "background" 中完成这项工作(在 "off-screen" 的意义上),但您需要一个 "foreground Service"(操作栏中的图标)。否则,将应用打瞌睡,这往往会抑制您的应用正在使用的任何 WakeLocks
。
由于线程在生成它们的 activity 的生命周期之后仍然存在,我可以将我需要做的任何后台工作放在 HandlerThreads 上,例如,不需要服务。此外,当应用程序在后台绕过新的 Oreo 限制时,他们将保留 运行。
我是不是漏掉了什么?
此外,自从引入 Doze 模式以及从 Oreo 开始对后台工作增加更多限制后,我到底应该在什么时候使用服务来进行后台工作?除了 为未来条件(例如 WIFI 连接或充电)安排任务,然后我会使用 JobScheduler。但即使这样也可以通过 BroadcastReceiver 处理...
Also they will keep running when the app in in the background bypassing the new Oreo restrictions.
这不太正确。的确,只要您的应用程序处于活动状态,后台线程就会继续执行。问题是,您的应用程序可能不会存活很长时间! Service
用于向操作系统指示,"I don't want to get torn down; I still have useful work I have to do".
来自docs:
...[A Service represents] either an application's desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use.
和
It is not a means itself to do work off of the main thread
最终,当 Android 决定是否保留您的 App 时,它并不关心您拥有的线程数 运行、CountDownTimers
的线程数还没有完成,有多少 Runnables
你在队列中等待等等。它关心你是否有任何活动的应用程序组件。 Activity
可见吗?太好了,留下来。 Service
开始了吗?也很棒。 None 以上?也许是时候终止应用程序了。
所以这也回答了问题,"when exactly should I use a service to do background work?" 如前所述,服务不会为您完成工作,它只会帮助您生存。您可以尝试在 BroadcastReceiver
中启动一个线程(注意 most implicit broadcasts no longer work post-Oreo),但是一旦您从 onReceive()
中 return,您的应用程序很可能会被杀死 - - 除非你也有服务。
额外的POST-奥利奥注意事项
请注意,Service
可能只会帮助您的应用在离开前台 (docs) 后存活 "several minutes"。我知道解决这个问题的唯一方法是让你的 Service
成为 "foreground service."
此外,如果您需要确保设备在您的工作完成之前保持唤醒状态,则需要在前台安装一个组件。也就是说,您仍然可以在 "background" 中完成这项工作(在 "off-screen" 的意义上),但您需要一个 "foreground Service"(操作栏中的图标)。否则,将应用打瞌睡,这往往会抑制您的应用正在使用的任何 WakeLocks
。