Android Service

  • Service作为Android四大组件之一,在APP中扮演着重要角色,主要用于后台处理耗时性的逻辑,或执行需长期运行的任务。必要时甚至可以在APP退出情况下,让Service服务在后台依然保持运行状态。
  • 启动Service和启动Activity类似,都需要借助于Intent来实现。

概念

Service服务是运行在后台的,比如音乐播放器放在后台运行,用户可以变操作其他边听音乐。当APP需要执行耗时较长的操作、和别的程序交互时就需要使用Service。

服务类别

按运行地点服务可分为

本地服务Local

  • 本地服务依附在主进程上而非独立进程,这样在一定程序上节约了资源。
  • 本地服务因为是在同一进程因此无需IPC,也无需AIDL,相应地bindService会方便很多。
  • 本地服务的缺点是当主进程被kill杀掉后,本地服务便会终止。
  • 本地服务的应用场景如HTC的音乐播放器、天天动听音乐播放服务等。

远程服务Remote

  • 远程服务是独立的进程,对应进程名格式为所在包名加上所指定的android:process字符串。
  • 远程服务由于是独立进程,因此当在Activity所在进程被kill杀掉时,该服务会依然运行,不受其他进程影响,这样有利于为多个进程提供服务且具有较高的灵活性。
  • 远程服务是独立的进程,会占用一定的资源,而且使用AIDL进行IPC时会稍微麻烦。
  • 远程服务主要用于一些提供系统服务的Service,这种Service是常驻的。

Service不是一个单独的进程,除非使用android:process单独进行声明,否则是不会运行在单独的进程中,而会和启动它的程序运行在同一个进程中。

Service并非线程,意味着Service将在主线程中以运行。也就是说Service既不是进程也不是线程。

服务状态

Service是Android中实现程序后台运行的解决方案,非常适合用于去执行哪些无需和用户交互且要求长期运行的任务。服务的运行不依赖于任何用户界面,即使当程序被切换到后台,或用户打开了另外一个应用程序,服务仍然能够保持正常运行。

Service有两种启动方式,一种是通过startService()方式,一种是通过bindService()方式。

Service生命周期的两种状态

Service分为两种工作状态:一种是启动状态用于执行后台计算,一种绑定状态用于和其他组件和Service进行交互。这两种状态的服务是可以共存的,即Service既可以处于绑定状态和启动状态。

启动状态 startService()

当APP组件通过调用startService()方法启动服务时,服务即处于“启动”状态。一旦启动服务即可以在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务,已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。

当第一次使用startService启动服务时,系统实例化一个Service实例,然后依次调用onCreate()onStartCommand()方法,然后运行。需要注意的是,再次使用startService()方法时不会再创建一个新的Service对象,但还是会再次执行onStartCommand()方法。如果想要停掉一个服务,可使用stopService()方法。此时onDestroy()方法会被调用,不管前面使用多少次的startService()stopService()方法调用依次就可以停掉服务。

绑定状态 bindService()

当APP组件通过调用bindService()绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个”客户端-服务器”接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信IPC跨进程执行这些操作。仅当与另一个APP组件绑定时,绑定服务才会运行。多个组件可以同时绑定到该服务,但全部取消绑定后该服务即会被销毁。

当调用者首次使用bindStart()绑定一个Service时,系统会实例化一个Service对象,并一次调用其onCreate()方法和onBind()方法,然后调用者就可以和服务进行交互了。此时,如果再次使用bindService绑定服务,系统不会创建新的Service对象,也不会再调用onBind()方法。如果需要接触与与这个服务的绑定,可使用unbindService()方法,此时onUnbind()onDestroy()方法会被调用。

服务声明

服务作为Android的四大组件,使用前需要在AndroidManifest.xml清单文件中声明,声明的目的是为了让PackageManagerService(PMS)能够解析出服务,并建立对应的数据结构。



  • android:exported 表示是否允许除了当前程序外的其他程序访问此服务
  • android:enabled 表示是否启动此服务
  • android:permission 表示权限声明
  • android:process 表示是否需要在单独的进程中运行,当设置为:remote时表示服务在单独的进程中运行。
  • android:isolatedProcess 设置为true表示服务会在特殊的进程下运行,此进程与系统其他进程分开且没有自己的权限。于其通信的唯一途径时通过服务的API。

由于服务启动方式(运行类型)不同可分为三类

  • foregroup service 前台服务执行一些对于与用户来说可感知的操作,如Audio应用使用前台服务来播放歌曲。
  • background service 后台服务执行的操作对用户而言是不可感知的
  • bound service 绑定服务主要提供C/S接口,允许组件与服务进行通信,或是跨进程的通信。

Activity与Service之间的通信

将绑定到Service上的组件称为客户端,Service称为服务端,它们之间的通信可以在同一进程也可以在不同的进程。要进程通信就要在客户端获取一个IBinder对象,获取对象的方式有三种方式:

  • 继承Binder
  • 使用Messager
  • 使用AIDL

你可能感兴趣的:(Android Service)