【私人備忘錄】Android P ActivityManagerService(三)Service啓動和綁定

一、startService代碼流程

Activity.java
startService(mBase.startService())
Context.java
startService()
ContextImpl.java
startService() → startServiceCommon(ActivityManager.getService().startService())
ActivityManagerService.java
startService(mServices.startServiceLocked())
ActiveServices.java
startServiceLocked() → startServiceInnerLocked() → bringUpServiceLocked(realStartServiceLocked(r, app, execInFg)) → realStartServiceLocked(app.thread.scheduleCreateService() && sendServiceArgsLocked(r.app.thread.scheduleServiceArgs()))
ActivityThread.java
1、scheduleCreateService(sendMessage(H.CREATE_SERVICE, s)) → handleMessage(case CREATE_SERVICE) → handleCreateService() → Service.onCreate
2、scheduleServiceArgs(sendMessage(H.SERVICE_ARGS, s)) → handleMessage(case SERVICE_ARGS) → handleServiceArgs(res = s.onStartCommand(data.args, data.flags, data.startId)) → Service.onStartCommand

備註:
handleCreateService()主要乾了以下幾件事:
1、通過類加載器創建Service的實例;service = packageInfo.getAppFactory().instantiateService(cl, data.info.name, data.intent);
2、創建ContextImpl對象;ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
3、創建Application對象並調用其onCreate,不過Application的創建過程只會有一次;Application app = packageInfo.makeApplication(false, mInstrumentation);
4、調用Service的attach方法建立ContextImpl和Application的關係,過程和activity類似;service.attach(context, this, data.info.name, data.token, app, ActivityManager.getService());
5、調用Service的onCreate方法並將Service對象存儲到ActivityThread中的一個列表中;service.onCreate(); mServices.put(data.token, service);
 

二、bindService代碼流程

ContextWrapper.java
bindService();Activity.java調用的是爺爺類ContextWrapper.java的bindService()
Context.java
bindService()
ContextImpl.java
bindService() → bindServiceCommon(ActivityManager.getService().bindService())
ActivityManagerService.java
bindService(mServices.bindServiceLocked())
ActiveServices.java
bindServiceLocked(bringUpServiceLocked() && requestServiceBindingLocked())
1、bringUpServiceLocked() → realStartServiceLocked(r, app, execInFg) → 接下去可以參考上面邏輯
2、requestServiceBindingLocked(r.app.thread.scheduleBindService())
ActivityThread.java
scheduleBindService(sendMessage(H.BIND_SERVICE, s)) → handleMessage(case BIND_SERVICE) → handleBindService(ActivityManager.getService().publishService())
ActivityManagerService.java
publishService(mServices.publishServiceLocked())
ActiveServices.java
publishServiceLocked(c.conn.connected(r.name, service, false))
LoadedApk.java
ServiceDispatcher.connected() → RunConnection(run()) → doConnected(mConnection.onServiceConnected(name, service)) → ServiceConnection.onServiceConnected()

備註:
1、c.conn是ConnectionRecord中的conn是IServiceConnection,是LoadedApk中ServiceDispatcher的InnerConnection實現的;private static class InnerConnection extends IServiceConnection.Stub
2、ServiceDispatcher.connected()中mActivityThread.post(new RunConnection(name, service, 0, dead));RunConnection經由ActivityThread中的H的post方法運行在主線程中,客戶端ServiceConnection中的方法在主線程被回調。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章