Service的启动
Service的启动包括两种,一种是startService、一种是bindService。
一、先从简单看起:startService我们平常直接调用的startService,真正实现在ContextImpl.java中,代码路径为:frameworks/base/core/java/android/app/ContextImpl.java
从上述代码中,可以得知直接调用了AMS的startServcie,AMS的代码路径为:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
上述代码mServices指的是ActiveServices,这是AMS用来辅助管理Service的类,代码路径为:frameworks/base/services/core/java/com/android/server/am/ActiveServices.java在startServiceLocked最后调用了这个:
return startServiceInnerLocked(smap, service, r, callerFg, addToStarting);
在bringUpServiceLocked中会调用realStartServiceLocked方法
app.thread就是ApplicationThread的Binder引用,接下来来到ApplicaitonThread的scheduleCreateService中,代码路径如下:frameworks/base/core/java/android/app/ActivityThread.java
在这个里面只是简单了发送了一个消息,消息被Handler类H接受,调用下面部分:
在handleCreateService中会调用service的onCreate方法,代码如下所示:
至此startService的启动流程就结束了
二、接下来看看bindService
bindService相对来说比较复杂,同理,bindService这个方法的实现还是在ContextImpl路径如下:frameworks/base/core/java/android/app/ContextImpl.java
上述代码所圈的最后就是调用AMS的bindService方法。
bindService会调用ActiveServices的bringUpServiceLocked,bringUpServiceLocked又会调用realStartServiceLocked方法,realStartServiceLocked又会调用app.thread的scheduleCreateService方法,然后经过一系列转化,最终调用到Service的onCreate方法,这个逻辑和上述是一样的,不同的是,在ActiveServices的bindServiceLocked这个方法中,会调用requestServiceBindingLocked这个方法:
这里会调用app.thread.scheduleBindService方法,代码如下:
还是发了一个消息交给Handler类H来处理:
接下来又回到AMS中:
在publishServic方法中,又调用了ActiveServices的publishServiceLocked方法
上述c.conn的类型为:ServiceDispatcher.InnerConnection,代码路径为:frameworks/base/core/java/android/app/LoadedApk.java
sd.connected的代码如下:
mActivityThread.post,其中mActivityThread就是ActivityThread中的H,这样就会把RunConnection post到主线程。
doConnected方法如下所示:
在这里就会调用客户端的onServiceConnected方法,因为RunConnection是运行在主线程中,所以onServiceConnected方法是在主线程回调的。至此,bindService的过程也结束了