3

Activity从 a 和从 aService启动的后台线程有什么区别Activity吗?补充:后台线程不与 UI 交互。

我目前有一些从Activity. 大多数是通过AsyncTask,一个是通过我自己的ExecutorService。我想知道重构代码以将它们移动到 aServiceIntentService.

4

2 回答 2

3

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

  • 活动是根据活动生命周期状态机运行的事物。各个处理程序中的代码与附加到 UI 的事件循环交互。
  • 服务是根据服务生命周期状态机运行的事物。各个生命周期处理程序中的代码执行操作以处理 Intent 等内容,但不通过UI 与用户交互。

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

您可以为应用程序创建单独的线程,或者使用 anAsyncTask来完成工作并将其轻松发布到 UI 线程(使用 Service 不太容易实现这一点)。

于 2012-06-10T17:45:28.587 回答
1

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

在 Android 文档中:

注意:使用工作线程时您可能会遇到的另一个问题是由于运行时配置更改(例如当用户更改屏幕方向时)导致活动中的意外重启,这可能会破坏您的工作线程。要了解如何在这些重启之一期间保留您的任务以及如何在活动被销毁时正确取消任务,请参阅 Shelves 示例应用程序的源代码。

于 2012-06-10T17:39:31.017 回答