Activity之Service

310 阅读4分钟

一、Service介绍

Service是android程序中四大基本组件之一,它和activity样都是Context的子类。只是它没有UI界面,是在后台运行的组件。

Service主要用于后台运行的程序,该类程序基本上不需要与用户进行交互,且要求长期运行。

Service默认不会运行在子线程中,它也不允许在一个独立的进程中,它同样执行在UI进程中,因此,不要在Service中执行耗时的操作,除非你在service中创建子进程来完成耗时操作。


二、Service分类

1、按照运行地方分类:

本地服务(LocalService)

  • 运行地方:必须依附于主进程
  • 优点:因为依附于主进程,因而一定程度上节约资源,另外LocalService因为依附于主进程,因而不需要使用AIDL进行通信,从而bindService使用更方便。
  • 缺点:但因为附属于主进程,因而当主进程被终止时,LocalService也会被终止
  • 应用:音乐播放器等不常驻服务


远程服务(Remote Service)

  • 运行地点:运行在独立的进程中
  • 优点一:Service为独立的进程,对应进程名格式为所在包名假设指定的android:process 字符串。
  • 优点二:因为是独立进程,因而activity被终止时,Service仍在存在,有利于为多个进程提供服务,且灵活性高
  • 缺点:因为是独立进程,肯定占用资源比较多,并且还需要进行进程间通信(IPC),使用AIDL较为麻烦。
  • 应用:提供系统服务常驻的Service。


2、按照运行类型分类

前台服务

  • 会在通知栏显示nogoing的Notification
  • 应用:当服务被终止时,通知栏的Notification也会消失,这样对于用户有一定的通知作用。常见的如音乐播放器。


后台服务

  • 默认的服务,即为后台服务
  • Service被终止时,用户看不到效果。某些不需要在终止时提醒的Service,如天气更新、邮件同步等


3、按照使用方式分类

startService启动的服务

  • 该服务是执行一个后台服务,不需要进行通信,即不需要通过onbind()返回信息。
  • 启动方式:onCreate() -> onStartCommand() -> onDestroy()
  • 通过startService()方法启动服务,需要通过stopService()或在onStartCommand()中stopSelf()来关闭服务。


bindService启动的服务

  • 该服务用于执行完毕后,通过onbind()与主进程进行通信,因而主进程能感知该服务是否停止。
  • 启动方式:onCreate() -> onBind() -> onUnbind() -> onDestroy()
  • 这种类型的服务主要用于与主进程进行交互。


上述两种方法的结合


三、生命周期

onCreate()

在Service第一次创建时执行该方法,来执行只运行一次初始化工作一次调用)。如service已经存在,则该方法不调用。


onStartCommand()

  • 客户机每次调用startService()方法启动该Service都会调用该方法(多次调用
  • 该方法对应于启动方式startService(),因而需通过stopSelf()或stopService()来停止服务。


onBind()

  • 组件通过bindService()方法来绑定Service时系统调用该方法(一次调用,一旦绑定后,下次再调用bindService()不会回调该onBind()方法)。
  • 在实际应用中,Service提供onbind()来是实现主进程与Service的通信
  • 若不绑定,则该方法返回值为null。


onUnbind()

当前组件调用unbindService(),则是解除绑定(一次调用,解除绑定后,再次调用会抛出异常)。


onDestroy()

系统在Service不再被使用时就会调用该方法进行销毁一次调用)。Service会在该方法总释放资源,,如线程、已注册的监听器等。


  • startService / stopService

生命周期:onCreate() -> onStartCommmand() -> onDestroy()

Service被某个Activity调用startService()方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定,该Service都会在后台进行,知道被调用stopService,或自身的stopSelf()。

内存不足也会停止服务。

注意:

  • 第一次调用startService(),就会触发onCreate()和onStartCommand(),以后在服务运行中调用startService,只会触发onStartCommand。
  • 不管startService调用多次stopService一次就会停止服务


  • bindService / unbindService

生命周期:onCreate -> onBind -> onUnBind() -> onDestroy()

通过bindService()方法启动,不管bindService被调用几次,Service的onCreate方法只会执行一次,并且onStartCommand方法始终不会被调用

建立连接后,Service会一直运行,除非调用unBindService来解除绑定、断开连接或调用该Service的Context不存在(如Activity被finish(),即通过bindService启动的Service的生命周期依附于启动它的Context),系统此处会自动停止该Service。


bindService方法的返回值在ServiceConnection类中,该类重写了两个方法,onServiceConnected()和onServiceDisConnected(),其中onServiceConnected方法则是返回了Service类中onBind()的返回值IBinder