Android中的服务与线程

时间:2014-04-08 10:05:46

标签: android service

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

文档说

  

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

我已经读过这个帖子Application threads vs Service threads,说同样的服务是为了在后台运行操作。

但是这里也可以使用Thread来完成。他们之间的任何差异以及你应该使用它们的地方

6 个答案:

答案 0 :(得分:25)

根据最新文档更新:

Android在其文档中包含了何时应该使用Service vs Thread。以下是它的说法:

  

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

     

请记住,如果您使用某项服务,它仍会在您的服务中运行   默认情况下,应用程序的主线程,所以你仍然应该创建一个新的   服务中的线程,如果它执行密集或阻塞   操作

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

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

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

注意:启动API级别23,您应该Test your app with Doze

Android Documentation - Services

答案 1 :(得分:22)

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

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

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

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

答案 2 :(得分:4)

这是我基本遵循的原则

时使用线程
    操作发生时,
  • app必须可见。
  • 后台操作运行相对较短(不到一两分钟)
  • 活动/屏幕/应用程序与后台操作高度耦合,用户通常会等待'在应用程序中执行任何其他操作之前完成此操作。 在这些情况下使用线程可以获得更清晰,更具可读性的信息。可维护的代码。据说可以使用服务(或IntentService)。

时使用服务
    当操作发生时,
  • app可能是不可见的(前台服务等功能可能有助于操作被中断)
  • 用户无需等待'为了完成在应用程序中做其他事情的操作。
  • app可见,操作独立于应用程序/屏幕上下文。

答案 3 :(得分:2)

来自https://developer.android.com/guide/components/services.html

的参考资料

即使用户没有与您的应用程序交互,服务也只是一个可以在后台运行的组件。因此,只有在您需要的时候才应创建服务。

如果您需要在主线程之外执行工作,但只有在用户与您的应用程序交互时,您应该创建一个新线程而不是服务。

例如,如果你想播放一些音乐,但只有在你的活动正在运行时,你可以在onCreate()中创建一个线程,开始在onStart()中运行它,然后在onStop()中停止它。

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

答案 4 :(得分:0)

我的解释方法很简单:

  1. 在活动中并且想要进行一些与主线程频繁通信的后台操作时,请创建一个线程。 警告-不要创建太多线程,因为1个线程等于1个处理器线程。如果您想对多个线程进行并行处理,请尝试使用Executors

  2. 现在,您需要长期运行且与UI交互较少的操作,然后选择服务。请记住,服务在UI线程上运行。但是现在您希望处理应该在后台线程中完成,然后使用Intent服务。 Intent服务维护其线程池,而不创建新线程并按顺序运行任务。

答案 5 :(得分:-1)

可能你已经阅读了关于它们的文档描述,我不会重复它们,相反我会尝试用自己的话来回答,希望它们会帮助你。

Service就像一个Activity但没有界面。例如,如果您想要获取天气,则不会为此创建空白活动,为此您将使用服务。

Thread是一个主题,可能你已经从其他部分知道了。您需要知道无法从线程更新UI。您需要使用处理程序,但请进一步阅读。