,1.service启动有哪几种方式?
2.service启动过程中主要流程有哪些?
3.service启动过程涉及哪些参与者,通信过程是怎样的?
从startService函数开始,通过AMS的binder对象,然后向AMS发起了startService调用。
AMS根据intent查询到ServiceRecord对象(每个应用端的Service在AMS里面都要对应这么一个对象),pendingStarts是之后准备调用onStartCommend函数时用的。
ServiceRecord里的app就表示Service所在的进程,如果Service所在的进程非空并且已经就绪了,sendServiceArgsLocked函数主要是调用应用端的onStartCommend函数。
app是服务所对应的进程,realStartServiceLocked是真正启动Service的方法,startProcessLocked是启动Service的进程。
attachApplicationLoced是处理这些pendingService的
scheduleCreateService是向应用端发起IPC调用,应用端收到之后会创建Service,执行Service里的OnCreate回调.
Service的创建过程和Activity的大同小异,都是通过LoadedApk里的classLoad去加载Service这个类,然后给service赋予上下文对象,执行onCreate回调。
scheduleServiceArgs会调用到应用端,应用端封装了一个ServiceArgsData对象并扔到应用主线程去处理。
应用端通过ServiceRecord查出存储的Service,如果Service不为空就去执行onStartCommand方法。
AMS通过Socket向Zygote发起启动应用进程的请求,应用进程启动后执行ActivityThread的main函数,里面会向AMS发起attachApplication调用,AMS会向应用发起bindApplication的调用,然后就去处理pendingService, scheduleCreateService是让应用端createService的,scheduleServiceArgs是让应用端执行onStartCommand的。
bindServiceLocked是启动Service的,他没有将service加到pendingService队列里,所以不会触发onStartCommand,这就是与onStartServie的区别。









网友评论