Android四大组件-Service启动流程详解

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的过程也结束了

发布了14 篇原创文章 · 获赞 45 · 访问量 2448

猜你喜欢

转载自blog.csdn.net/weixin_42683077/article/details/104044694
今日推荐