(十八)四大组件的工作过程-Service

时间:2024-03-24 13:38:12
Service的工作过程

启动过程:
从ContextWrapper的startService方法来看,看到由ContextImpl的mBase对象的startService方法开始,在startService方法里返回startServiceCommon方法,
在该方法里,通过ActivityManagerNative.getDefault()方法启动service。该startService方法是一个远程方法,在其中会通过ActiveService的对象mService完成后续的启动过程。在startServiceLocked方法的尾部会调用startServiceInnerLocked方法,在该方法内部调用bringUpServiceLocked方法,在该方法内部又调用realStartServiceLocked方法。

(十八)四大组件的工作过程-Service
在handleCreateService方法里做了如下操作:
  通过类加载器创建Service的实例
  创建Application对象并调用其onCreate方法
  创建contextImple对象,并通过attach方法与Service关联。
  调用onCreate方法并将Service存储到ActivityService的一个列表内。

在ActivityThread中还会调用handleServiceArgs方法来回调Service的onStartCommand方法。

Service的绑定过程
和启动过程一样,绑定过程也是从ContextWrapper开始的,从bindService方法内返回mBase的bindServiceCommand方法,在这个方法里完成下列事情:

  1. 将客户端的ServiceConnection对象转化为ServiceDispatcher.InnerConnection对象,有肯跨进程通信,因此InnerConnection充当Binder角色,ServiceDispatcher起连接InnerConnection和ServiceConnection的作用。这个过程是通过LoadedAPK的getServiceDispatcher方法实现。在这个方法里维护了一个ArrayMap,又来存储ServiceConnection和ServiceDispatcher的映射。当客户端和Service建立连接后,系统会通过InnerConnection调用ServiceConnection的onServiceConnection方法,这个过程有可能是跨进程的,当ServiceDispatcher建立好后,通过getServiceDispatcher方法返回其内保存的InnerConnection对象。

  1.  调用AMS的ActivityManagerNative.getDefault的bindService方法,返回ActiveService的 bindServiceLocked方法-->>bringUpServiceLocked方法-->realStartServiceLocked方法,realStartServiceLocked方法的执行逻辑跟之前的一样。
  2. Service的绑定过程会调用app.Thread的scheduleBindService方法,这个过程实现在ActiveService的requestServiceBindingLocked方法里,在scheduleBindService方法里通过Handler H来中转。
  3. 在H里接收到BING_SERVICE的消息时,会交给ActivityThread的handleBindService方法处理。
  4. 在handleBindSrvice中首先根据token取出Service对象,然后通过onBind方法返回客户端一个Binder对象,接着调用AMS的publishService方法回调客户端里的onServiceConnected方法。
  5. 在publishService方法里又调用ActiveServices的publishServiceLocked方法,里面核心内容:c.conn.connected(r.name,service)方法。c的类型是ConnectedRecord,c.conn的类型是ServiceDispatcher.InnerConnection,service就是返回的binder对象。
  6. InnerConnection的connected方法有调用了ServiceDispatcher的connected方法。在SD的该方法里调用H的post方法,将RunConnection对象抛到主线程中,
  7. Runnection里调用了SD的doConnected方法,由于SD储存了客户端的ServiceConnection对象,因此他可以方便的调用onServiceConnected方法。
(十八)四大组件的工作过程-Service

(十八)四大组件的工作过程-Service