(Android基础)什么是Service

##概述:

和Activity一样,Service同样继承至Context,是Android的四大组件之一,但是和Activity不一样的是Service的使用场景,Service使用于后台运行代码,而不现实界面,一般用于执行耗时较长的操作,当然Service默认运行在主线程,需要执行耗时操作需要在Service中创建一个新的线程.
图片加载失败

###生命周期说明:

  • onCreate():
     首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或onBind() 之前)。如果服务已在运行,则不会调用此方法,该方法只调用一次
  • onStartCommand()
      当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果自己实现此方法,则需要在服务工作完成后,通过调用 stopSelf() 或 stopService() 来停止服务。(在绑定状态下,无需实现此方法。)
  • onBind():
      当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,必须返回 一个IBinder 接口的实现类,供客户端用来与服务进行通信。无论是启动状态还是绑定状态,此方法必须重写,但在启动状态的情况下直接返回 null。
  • onDestroy():
      当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等,这是服务接收的最后一个调用。

###Service的Framework流程

  • startService():
    当调用ContextImpl里面的startService时,会通过远程调用调用Ams的startService方法,Ams中调用ActiveServices来管理Service的启动,调用startServiceLocked,在ActiveService中根据传入的启动Service的intent和其他的进程信息查询或创建ServiceRecord实例,如果需要启动的Service已经启动过了,那么再次回调Service的onStartCommand(),如果需要启动的Service所在的进程还未启动则先创建对应的进程,如果所在的进程已经创建了那么远程调用客户端的scheduleCreateService,从而执行Service的attach和onCreate()方法,接着Ams通知ApplicationThread发送消息执行Service的onStartCommand(),
    当主动调用stopService或则内存不够或则应用退出时,Ams会远程调用Service的onDestory方法.
  • bindService:
    在调用bindService时,先会创建ServiceConnection接口的实现类,然后ActivityThread在调用bindService时,创建与ServiceConnection一一对应的IBinder的实现类ServiceDispatcher.InnerConnection,在调用Ams将这个IBinder实现类的引用传入
    Ams中方便,Ams回调IBinder的connect方法,同时在IBinder实现类的创建的时候为其对象创建死亡代理,在接收到死亡通知时,回调
    ServiceConnection的disconnect方法.
    在Ams中调用bindService会为其创建ServiceRecord和关联进程信息与调用者组件的ConnectionRecord,之后依次调用attach,onCreate,onBind,在调用onBind方法时会返回在Service中创建的IBinder的实现类,然后将这个IBinder的实现类通过publishService传递给Ams然后调用bindService时传递的IBinder实现类的connect方法,从而传递到绑定时的组件中,当主动调用unbind等方法时回调onUnbind方法和onDestory方法
您的一份奖励,就是我的一份激励