Service的启动
展开全部
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对应用程序进程发起服务连接。
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对应用程序进程发起服务连接。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询