让我举个类比。
活动(Activities)和服务(Service)就像项目。
活动就像外部项目,这是客户(用户)所看到的。
服务就像内部项目。可能会有多个内部项目支持一个外部项目,也可能完全没有。
您可以“暂停”外部项目,但仍然可以继续支持它的内部项目。
主线程(Main Thread)就像公司老板
老板不应该因为太忙而被拖延,因为他不能迟到开会(UI冻结),否则客户(用户)会不满意。
线程(Threads)就像公司员工。
您拥有的员工越多,同时可以处理的事情就越多,前提是您有足够的设备(CPU速度)来支持它们。
多个员工可以同时在同一项目上工作,但老板应该只关注活动。
总体来说:一个应用程序的服务不仅可被该应用程序其他组件使用,还可被其他应用程序使用。
服务适用于程序中非GUI部分。
大多数情况下:服务比线程更加独立。服务比线程的生命周期更长。服务比线程更为复杂。
顺便提一句,线程并不仅仅在后台运行,它也可以在前台运行。
服务更类似于一个无头活动。
重要的一点是,服务是关于管理应用程序生命周期和在您的应用程序不在前台(没有UI可见)时保持工作运行能力的能力。它还提供了向其他应用程序公开功能的能力。
http://developer.android.com/reference/android/app/Service.html#WhatIsAService
通常,在启动服务时,您也会启动一个工作线程。在清单中有一些设置可以导致服务在新进程中启动,但通常您不需要这样做,因为它会使与您的服务通信更加困难。
当您需要从UI线程卸载工作而应用程序在前台时,请在Activity中使用一个普通线程,但是这项工作可以在您不再处于前台时停止。(可能会发生您的应用程序在不在前台时继续运行,但取决于许多因素)一般来说,Android可以在不在前台时杀死您的Activity,如果您的应用程序进程没有任何Activity或Service,则可以将其杀死。
使用带有线程的服务来执行在应用程序处于后台时进行的工作,并且您希望获得更好的寿命保证。
使用服务来向其他应用程序公开非UI功能。
Android中的Service
默认情况下不会在单独的进程中运行,甚至不会在单独的线程中运行!它在应用程序的主线程(UI线程)中运行。因此,如果您想在Service
中执行一些耗时的任务,请自己启动一个单独的线程,或使用IntentService
。
我们为什么需要服务是为了避免资源短缺。
例如,您在打开另一个应用程序后打开应用程序,因此在此时您的应用程序被添加到后台任务中。
在打开多个应用程序时,您的应用程序可能会被Android系统杀死。因此,如果您的应用程序具有服务,则不会被系统杀死,因为服务具有更高的优先级,即使它可能会杀死具有服务的应用程序,因此我们在onStartCommand()
方法中使用常量返回类型。这就是START_STICKY,START_NOT_STICKY
和DELIVER_INTENT
。