Android背景线程:从活动和服务启动之间的差异

时间:2012-06-10 17:18:03

标签: android

ActivityService开始的Activity运行后台话题是否有任何区别? 已添加:后台线程不与UI交互。

我目前有一些从Activity启动的后台主题。大多数是通过AsyncTask,一个是通过我自己的ExecutorService。我想知道重构代码以将这些代码移到ServiceIntentService是否有重大好处。

2 个答案:

答案 0 :(得分:3)

您似乎对活动和服务的定义感到困惑。说清楚:

  • 活动是根据活动生命周期状态机运行的内容。相应处理程序中的代码与附加到UI的事件循环交互。
  • 服务是根据服务生命周期状态机运行的内容。各个生命周期处理程序中的代码执行操作以处理诸如Intents之类的内容......但是通过UI与用户交互。

然而,这两个都在应用程序的“主线程”上运行。活动或服务(或广播接收器,内容提供商等)本身一个线程。查看文档,您将看到Activity和Service类实际上不构成一个线程。相反,它们是将在Android框架内运行的钩子,框架将在适当的时候在应用程序的“主”线程上调用它们。

您可以为应用创建单独的线程,或者使用AsyncTask进行工作并轻松地将其发布到UI线程(使用服务不太容易实现)。 / p>

答案 1 :(得分:1)

绑定到Activities的线程具有相同的生命周期。因此,如果重新启动/杀死Activity,线程也将重新启动/终止。如果您不管理活动的生命周期,则会出现此问题。在这种情况下,服务很好。您可以销毁活动,并且仍然可以在后台运行工作线程(在服务中)。但请注意,如果Android系统需要资源(例如内存),它将首先终止服务(然后根据Sticky标志重新启动它们)。在我看来,将线程从“活动”更改为“服务”没有实际的好处,因为您可以控制活动的工作流程。如果线程很重(并暂时停止UI),可以考虑将它们放在单独进程的服务中(在AndroidManifest中放置服务的进程名称)。

在Android文档中:

  

警告:使用工作人员时可能遇到的另一个问题   由于运行时,线程在您的活动中意外重启   配置更改(例如用户更改屏幕时)   orientation),这可能会破坏你的工作线程。看看你怎么样   在其中一次重启期间以及如何正确地执行任务   销毁活动时取消任务,请参阅源代码   对于Shelves示例应用程序。