Service的启动

 我来答
没文化的大脑袋CU
2022-08-01 · TA获得超过2697个赞
知道小有建树答主
回答量:556
采纳率:100%
帮助的人:78.9万
展开全部
StartService 过程

1.在应用程序进程中 

Context的实现类contextImpl调用startService,最终调用IActivityManager.startService()

2.在SystemService内

AMS通过binder调用进入SystemServer进程启

在bringUpServiceLock()方法中,如果启动的服务所在的进程已存在,那么会通过realStartServiceLock()方法去动服务. 

如果进程不存在,那么会通过AMS.startProcessLock()方法先启动对应的进程(触发Application的onCreate方法),之后再启动服务. 

最终通过IApplicationThread.scheduleCreateService()方法和IApplicationThread.scheduleServiceArgs()方法进入App进程处理. 

3. 在App进程内scheduleCreateService()方法最终通过调用handeCreateService()方法,通过反射创建Service对象,并调用Service.attach()方法及回调Service.onCreate()方法。 

scheduleServiceArg()方法最终通过调用handleServiceArgs()方法,回调Service.onStartCommand()方法。至此,Service的启动过程分析完毕。

Service 的绑定过程

此章节分为两个部分: 

1 、 ContextImpl 到 AMS 的调用过程

2 、 Service 的绑定过程

1 、 ContextImpl 到 AMS 的调用过程

ContextImpl在应用程序进程,bindServiceCommon方法作用:将ServiceConnection封装为IServiceConnection类型的对象sd,从IServiceConnection名子我们就知道它实现了Binder机制,这样Service的绑定就支持了跨进程。然后在ContextImpl里面将sd传入AMS的bindService方法(ActivityManager.getService().bindService(…,sd, ...))。 

2 、 Service 的绑定过程

在bindServiceLocked方法中,如果Service启动了,AMS会调用c.conn.connected()(注:c.conn指的是IServiceConnection)方法来向主线程发送handler.post方法来出发服务绑定。

在bindServiceLocked方法中,如果Service没有启动,则会调用bringUpServiceLocked启动应用程序进程(触发Application的onCreate方法)方法来启动Service,最终由ActivityThread来调用Service的onCreate方法启动Service,这也说明了bindService方法内部会启动Service。 

然后调用r.app.thread.scheduleBindService()向主线程发送BIND_SERVICE消息,然后主线程通过ActivityManager.getService().publishService()向Service发送绑定请求。

AMS收到主线程发送的publishService()请求后,会调用c.conn.connected()方法通知Service,让Service对应用程序进程发起服务连接。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式