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

问题描述 投票:18回答:7

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

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

据我所知

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

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

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

android multithreading service
7个回答
34
投票

让我来算一个比喻。

活动和服务就像项目。

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

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

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

主线程就像公司的老板

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

线程就像公司的员工。

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

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


6
投票

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

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

因此,当你启动一个服务时,你会告诉系统类似的东西:“嗨。我在这里做生意,请不要杀我直到我完成,拜托。”和Android注意你的要求。


5
投票

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

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

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

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


4
投票

服务更类似于无头活动。

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

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

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

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

使用带线程的服务可以在您的应用处于后台时进行工作,并且您希望更好地保证生命周期。

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


2
投票

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

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

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

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


1
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.