Android后台线程:从Activity和Service启动的区别

3
Activity启动后台线程和从被Activity启动的Service中运行有什么区别吗?补充:这些后台线程不与UI交互。
我目前有一些从Activity启动的后台线程,大部分是通过AsyncTask启动的,还有一个是通过我的自定义ExecutorService启动的。我想知道将它们移动到ServiceIntentService中是否会有显著的好处。

1
这取决于你的AsyncTasks在做什么。AsyncTask的重点是它充当后台线程和Activity UI之间的“桥梁”。如果您不需要与UI进行任何预/后交互或进度更新以了解线程正在执行的操作,则不需要使用AsyncTask。因此,您可以在Activity中简单地调用通用的Thread,或将工作分配给Service - Squonk
一个服务可以比活动更长寿,我认为异步任务不行。就像Squonk说的那样,使用异步任务可以更容易地进行UI交互。 - Ran
2个回答

3
您似乎对活动和服务的定义感到困惑。为了明确起见:
- 活动是按照活动生命周期状态机运行的东西。各个处理程序中的代码与附加到 UI 的事件循环交互。 - 服务是按照服务生命周期状态机运行的东西。各个生命周期处理程序中的代码执行操作,以处理像意图等的事情,但不通过 UI 与用户交互。
两者都在应用程序的“主线程”上运行。然而,一个活动或服务(或广播接收器、内容提供者等)本身不是线程。查看文档,您会发现活动和服务类实际上并不形成线程。相反,它们是钩子,将在 Android 框架内运行,并且在适当的时间调用它们在应用程序的“主”线程上运行。
您可以创建单独的线程来运行应用程序,或使用 AsyncTask 轻松地在工作期间将其发布到 UI 线程(这是使用服务不太容易实现的)。

谢谢。我知道Activities和Services的定义,它们如何处理主线程,并且我可以在UI线程上创建单独的线程或AsyncTask。我想知道从Activity或Service执行操作的区别。 - mparaz
1
@mparaz 关于它们的处理方式,它们应该没有区别。也就是说,在服务中启动线程与在活动中启动线程的处理方式不会有任何不同。 - Kristopher Micinski

1
绑定到活动的线程具有相同的生命周期。因此,如果重新启动/杀死活动,则线程也将重新启动/杀死。如果您不管理活动的生命周期,则会出现问题。在这种情况下,服务很好。您可以销毁活动并仍然在后台(在服务中)运行工作线程。但请注意,如果Android系统需要资源(例如内存),它将首先杀死服务(然后根据其粘性标志重新启动它们)。在我看来,将线程从活动更改为服务没有实际好处,因为您控制活动的工作流程。如果线程很重(并且在某些时候破坏UI),请考虑将它们放入单独的进程中的服务中(在AndroidManifest中放置服务的进程名称)。
在Android文档中:
警告:使用工作线程时可能遇到的另一个问题是由于运行时配置更改(例如用户更改屏幕方向)而导致活动意外重启,这可能会销毁您的工作线程。要了解如何在这些重启期间保持任务以及如何在销毁活动时正确取消任务,请参阅Shelves示例应用程序的源代码。

1
如果您重新启动/终止Activity,线程也将被重新启动/终止。是和否。例如,在屏幕方向改变的情况下,可以保持AsyncTask并将Activity重新连接到它。 - Squonk
谢谢。你看过将线程移动到另一个进程的好处吗?我不认为这会改善它,而且我相信在单独的进程中运行会有开销。 - mparaz
1
我已经看到了使用大量CPU/IO线程(解析15MB的XML并写入数据库)所带来的巨大好处。 - oxygenpt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接