为什么我应该使用Android服务而不是java线程

时间:2012-03-15 20:55:38

标签: android multithreading service

我对android服务和java线程感到困惑。

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

根据我的理解

  

服务在后台运行,所以做线程。

     

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

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

7 个答案:

答案 0 :(得分:34)

让我打个比方。

活动和服务就像项目一样。

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

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

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

主线程就像公司的老板

老板不应该被太多的工作所困扰,因为他不应该迟到会议(UI冻结)或客户(用户)会不高兴。

主题就像公司的员工一样。

你拥有的越多,你可以同时做的事情就越多,只要你拥有足够的设备(CPU速度)。

多名员工可以同时处理同一个项目,但老板应该只对活动有所帮助。

答案 1 :(得分:6)

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

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

因此,当您启动服务时,您告诉系统类似于:"嗨。我在这里做生意,在我结束之前不要杀了我。"和Android注意你的要求。

答案 2 :(得分:5)

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

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

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

顺便说一句,线程不仅仅在后台运行。什么在前台运行,也是一个线程。

答案 3 :(得分:4)

服务更类似于无头活动。

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

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

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

当您需要在应用程序位于前台时从UI线程卸载工作时,在Activity中使用一个正确的线程,但是当您不再处于前台时,此工作可能会停止。 (有可能你的应用程序将继续运行,而不是前景,但不能保证取决于许多因素)一般来说,如果Android不在前台,并且你的应用程序进程有没有可以杀死的活动或服务。

使用带线程的服务来完成当您的应用在后台时发生的工作,并且您希望更好地保证生命周期。

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

答案 4 :(得分:2)

根据Android开发人员指南(http://developer.android.com/guide/components/services.html#Basics):

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

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

为什么我们需要服务是为了避免资源紧张。 例如,您在打开另一个应用程序之后打开了一个应用程序,因此在您的应用程序添加到后台任务时。 在打开多个应用程序时,您的应用程序可能会被android系统杀死。因此,如果您的应用具有服务,则不会因为服务具有更高的优先级而被系统杀死,即使它可能杀死应用具有服务,因此我们在onStartCommand()中使用常量返回类型。方法。那是START_STICKY,START_NOT_STICKYDELIVER_INTENT