2012-03-15 117 views
16

我对android服务和java线程感到困惑。为什么我应该使用android服务而不是java线程

请帮我理解我应该在哪种情况下使用它们。

按我的理解,在后台

服务运行,所以做线程。

服务将用于网络操作或在后台播放mp3等活动,线程也是如此。

那么他们之间的实际差异以及何时使用他们每个人。

+1

我不确定你的问题是否仅限于Android,它通常是线程和进程之间的区别问题(我想android应用程序是当你拥有的进程处于非活动状态/死亡/停止状态时由操作系统维护的独立进程...) – Ali 2012-03-15 21:01:30

+0

它**是**特定于Android。服务是应用程序的一个组件。这是Android的术语。 Android的应用程序组件是非常具体的过程。服务更具体。 Android中的线程也是特定的,在某些情况下(GUI)你不能使用它们。 – Gangnus 2012-03-15 21:04:34

+1

阅读[进程和线程](http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html),[什么是服务?](http://developer.android.com /reference/android/app/Service.html#WhatIsAService)和[你应该使用服务还是线程?](http://developer.android.com/guide/topics/fundamentals/services.html#Basics)。 – yorkw 2012-03-15 21:07:12

回答

5

总是:您的应用程序的服务不仅可以由您的应用程序的其他组件使用,也可以由其他应用程序使用。

服务用于程序的非GUI部分。

主要是:服务比线程更独立。服务比线程更为长久。服务比线程更复杂。

顺便说一句,线程不会在后台运行。前景中运行的是一个线程。

1

Android Service不要在单独的进程中运行(默认情况下),甚至不要在单独的线程中运行!它在应用程序的主线程(UI线程)中运行,因此如果您想在Service中执行一些耗时的任务,请自行启动一个单独的线程,或使用IntentService

34

让我举个类比。

活动和服务就像项目。

活动就像外部项目。这是客户(用户)看到的。

服务就像内部项目。一个外部项目可能有几个内部项目,或根本没有。

您可以“暂停”外部项目,但支持它的内部项目仍可继续。

主线程,就像是一个公司

老板不应该太多工作​​给耽误了老板,因为他不应该迟到的会议(UI冻结)或客户端(用户)不高兴。

线程就像公司的员工一样。

越需要的东西越多,你可以在同一时间做的前提是你有他们所有的足够的设备(CPU速度)。

多名员工可以同时在同一个项目上工作,但老板应该只在活动上工作。

+0

很酷的例子... – John 2015-05-08 10:33:09

4

服务更类似于无头活动。

要理解的重要一点是,服务是关于管理应用程序的生命周期以及在应用程序不在前台时保持工作运行的能力(无UI可见)。这也是关于提供向其他应用程序公开功能的能力。

http://developer.android.com/reference/android/app/Service.html#WhatIsAService

通常在开始服务的时候,你也将启动一个工作线程。清单中有一些设置会导致在新流程中启动服务,但通常您不需要这样做,这会使您的服务与通信更加困难。

在应用程序处于前台时需要从UI线程卸载工作时,在您的活动中只使用线程,但当您不再处于前台时,此工作可能会停止。 (可能您的应用程序在不前台时仍会继续运行,但根据多种因素无法保证)一般来说,如果您的应用程序不在前台,并且您的应用程序进程有没有任何活动或服务可以被杀死。

通过线程使用服务来完成您的应用在后台进行的工作,并且您希望更好地保证终身服务。

使用服务向其他应用程序公开非UI功能。

6

我相信主要区别在于Android系统的态度。服务是Android基础设施的一部分,所以android会将服务识别为应用程序的工作部分,并将服务视为最后一个选项。而且,如果你的服务被杀死(例如由于内存不足),你可以说系统自动重新启动它,只要资源再次可用。此外,您可以调整服务优先级,以便像前台活动一样重要。至于线程,android不会将线程识别为必须保留的重要部分。所以平常的线程最终有更多的机会被杀死。

例如,如果你有一个活动,启动一个工作线程,然后去背景,因为android不认为线程作为工作部分,它可能认为应用程序什么也不做,因为没有活动或服务运行并杀死整个应用程序,包括工作线程。

因此,当你开始一个服务时,你告诉系统是这样的:“嗨,我在这里做生意,请不要在我完成之前杀死我。 Android会关注您的请求。

2

按照Android开发者指南(http://developer.android.com/guide/components/services.html#Basics):

服务仅仅是可以在后台运行,即使用户不与应用程序交互的组件。因此,只有在您需要的情况下才能创建服务。

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

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

相关问题