0

我读过很多帖子,说打瞌睡模式在链接前的特定时刻杀死了一个正在运行的服务,或者他们想要执行一个长时间运行的线程。

我不明白为什么你应该使用服务来做你知道在某些时候它最终会停止的后台工作。

例如:

你可以使用一个简单的线程:

 new Thread(new Runnable).start()

并在其中做一些工作。使用这个:

  1. 结合唤醒锁,设备不会休眠,线程将继续运行。
  2. 没有打瞌睡模式限制(网络除外,但可以说我们做本地事情)

因此,您可以不受任何限制地进行后台工作。尽管出于这些原因您应该使用服务链接

这是做背景工作的另一种方式(当然不是更好,但仍然是一种方式)吗?我错了吗?

4

2 回答 2

0

如果您正在运行从 启动的后台线程Activity,Android 不会知道您正在托管您的Activity. Android 几乎可以随时杀死托管您的操作系统进程Activity。如果用户按下 HOME 按钮或接听电话或打开通知并转到另一个应用程序,Android 可以随时终止操作系统进程。当用户返回您的应用程序时,Android 将创建一个新的 OS 进程并重新创建所有相关的活动,但您的后台线程无可救药地丢失了。这就是Android有服务的原因。

如果你启动 aService来执行你的后台处理,它Service也会启动后台线程,但是这些是受控的。你Service告诉 Android 如果它在Service处理Intent. Service因此可以通知您并根据需要重新启动(或继续)后台处理。您还可以Service在与运行您的活动的操作系统进程不同的操作系统进程中运行。Service如果用户从最近任务列表中删除您的应用程序,这将防止 Android 终止。

对于较新的 Android SDK,您还可以使用其他机制,例如JobScheduler.

于 2018-12-21T16:54:21.463 回答
0

除了服务之外,还有很多方法可以做后台工作检查这个链接它可以帮助你为你的工作选择最好的选择: Job Scheduler vs Background Service

@TheWanderer 所说的服务将在应用程序关闭一段时间后继续工作事件,这与一个简单的线程不同,它会在应用程序关闭时立即结束。

在您链接的链接中阅读此部分

服务的优先级高于其他后台进程,因此 Android 不太可能终止它。尽管可以将其配置为一旦再次有足够的可用资源就重新启动。您应该在有关进程和线程的文档中了解不同的进程及其优先级/重要级别。为它们分配与前台活动相同的优先级绝对是可能的,在这种情况下,它需要有一个可见的通知处于活动状态(通常用于服务播放音乐)。

于 2018-12-17T22:44:15.747 回答