App1 -> startService
|
| binder call
|
AMS -> startService
|
---> ActiveServices -> startServiceLocked
-> retrieveServiceLocked : 通过intent 和PackageManagerService 获得ServiceRecord
-> bringupServiceLocked: 根据Service的进程是否已经存在(ProcessRecord) 各表一支
-> (1、进程已经存在)realStartServiceLocked
-> bumpServiceLocked 这个方法主要是会schedule一个Service启动的Timeout消息
-> app.thread.scheduleCreateService ,跨进程进行onCreate方法的异步调用
-> sendServiceArgsLocked,跨进行进行onStartCommand方法的异步调用,传入service启动参数
-> (2、进程还不存在)
-> 先通过AMS启动目标进程, startProcessLocked
-> Process.start
-> startViaZygote
-> 将ServiceRecord加入到mPendingServices中,等到attachApplication被回调时再行处理
下面的问题是,目标进程启动后怎么回调到service中的attachApplication方法呢
Zygote启动后,会调用到ActivityThread的main方法
ActivityThread -> main
-> attach
-> 跨进程调用 AMS.attachApplication, 并传入一个ApplicationThread对象
AMS -> attachApplication 方法中会挨个调用ActivityStackSupervisor, ActiveServices等一票对象的attachApplicationLocked方法
ActiveService -> attachApplicationLocked 被调用到,回到(1、进程已经存在)的调用顺序中
|
| binder call
|
AMS -> startService
|
---> ActiveServices -> startServiceLocked
-> retrieveServiceLocked : 通过intent 和PackageManagerService 获得ServiceRecord
-> bringupServiceLocked: 根据Service的进程是否已经存在(ProcessRecord) 各表一支
-> (1、进程已经存在)realStartServiceLocked
-> bumpServiceLocked 这个方法主要是会schedule一个Service启动的Timeout消息
-> app.thread.scheduleCreateService ,跨进程进行onCreate方法的异步调用
-> sendServiceArgsLocked,跨进行进行onStartCommand方法的异步调用,传入service启动参数
-> (2、进程还不存在)
-> 先通过AMS启动目标进程, startProcessLocked
-> Process.start
-> startViaZygote
-> 将ServiceRecord加入到mPendingServices中,等到attachApplication被回调时再行处理
下面的问题是,目标进程启动后怎么回调到service中的attachApplication方法呢
Zygote启动后,会调用到ActivityThread的main方法
ActivityThread -> main
-> attach
-> 跨进程调用 AMS.attachApplication, 并传入一个ApplicationThread对象
AMS -> attachApplication 方法中会挨个调用ActivityStackSupervisor, ActiveServices等一票对象的attachApplicationLocked方法
ActiveService -> attachApplicationLocked 被调用到,回到(1、进程已经存在)的调用顺序中