Android中的服务与线程

N S*_*rma 26 service android

我正在寻找Android应用程序中应该使用的服务.

文件说

服务是一种应用程序组件,可以在后台执行长时间运行的操作,但不提供用户界面.

我已经读过这个线程应用程序线程vs服务线程,说相同的服务是在后台运行操作.

但是这里也可以使用Thread.它们之间的任何差异以及您应该使用它们的位置

use*_*104 28

根据最新文档更新:

Android在其文档中包含了何时应该使用Service vs Thread.这是它说的:

如果您需要在主线程之外执行工作,但只有在用户与您的应用程序交互时,您应该创建一个新线程而不是服务.例如,如果您想播放一些音乐,但只有在您的活动正在运行时,您可以在onCreate()中创建一个线程,在onStart()中开始运行它,然后在onStop()中停止它.还要考虑使用AsyncTask或HandlerThread,而不是传统的Thread类.有关线程的更多信息,请参阅进程和线程文档.

请记住,如果您确实使用了服务,它默认仍然在应用程序的主线程中运行,因此如果它执行密集或阻塞操作,您仍应在服务中创建新线程.

这两种方法之间的另一个显着区别是,如果您的设备休眠,线程将会休眠.然而,即使设备进入睡眠状态,服务也可以执行操作.我们以两种方法播放音乐为例.

线程方法:只有在您的应用处于活动状态或屏幕显示开启时才会播放音乐.

服务方法:即使您最小化应用程序或屏幕关闭,音乐仍然可以播放.

注意:启动API级别23,您应该使用Doze测试您的应用程序.

Android文档 - 服务

  • 请注意,正如第一篇文章中所解释的那样,Service不会在单独的线程中运行,这意味着如果您进行密集的CPU工作,它可能会阻塞主线程.阅读这篇文章了解更多信息http://stackoverflow.com/questions/7875926/does-android-service-run-from-a-seperated-thread-instead-of-ui (3认同)
  • 请添加谷歌文档的确切页面链接,这将解释为进一步阅读说明. (2认同)

N S*_*rma 22

服务旨在独立运行您的任务Activity,它允许您在后台运行任何任务.这在主UI线程上运行,因此当您想要执行任何网络或重负载操作时,您必须使用Thread那里.

示例:假设您希望每天在后台备份您的即时消息,然后在这里使用Service.

Threads用于在自己的线程而不是主UI线程中运行您的任务.当你想要做一些繁重的网络操作时,你会使用它,比如连续地向服务器发送字节,并且它与Android组件相关联.当你的组件破坏谁开始这个,那么你也应该停止它.

示例:Thread出于某种目的,您在Activity 中使用它,最好在活动销毁时将其停止.

  • 但是说你想播放音乐.这将是在后台/独立于任何活动的东西,所以你会使用服务权?但是你不能在不使用服务的情况下开始播放音乐的工作吗? (2认同)
  • @committedandroider 在这种情况下,您可以但不应单独使用线程,因为当设备屏幕关闭时,应用程序线程也会停止并停止您的音乐。相反,您可以创建一个 Service 并在其中使用一个工作线程,或者干脆您可以选择 IntentService,它是一个 Service 和一个工作线程。 (2认同)

Vin*_*hwa 6

这是我主要遵循的原则

在以下情况下使用线程

  • 操作发生时,必须显示该应用。
  • 后台操作运行时间相对较短(不到一两分钟)
  • 活动/屏幕/应用与后台操作高度关联,因此用户通常会先“等待”此操作完成,然后再在应用中执行其他操作。在这种情况下使用线程可以产生更清晰,更易读和可维护的代码。话虽如此,它有可能使用Service(或IntentService)。

在以下情况下使用服务

  • 发生操作时,应用可能不可见(诸如前台服务之类的功能可以帮助中断操作)
  • 无需用户“等待”操作完成即可在应用程序中执行其他操作。
  • 应用程序可见,并且操作独立于应用程序/屏幕上下文。

  • 正确的。如果这就是您想要实现的目标,您应该使用服务。 (2认同)