app执行bindService时会经过如下8次跨系统进程调用过程:
第1步:通过AMS.getService跨进程调用
第2步:AMS返回它的IBinder
第3步:通过AMS的IBinder调用AMS的bindService方法
第4步:而AMS存放有Server端的IBinder,所以可以调用Server的服务即schduleBindService()
第5步:server收到schduleBindService()后不能直接把它的IBinder发给Client,它也只能通过AMS,所以它调用AMS的getService获取AMS服务
第6点:AMS返回它的IBinder给Server
第7步:Server调用AMS的publishService服务,将Server的IBinder发送给Client,通过调用client的connected()接口
下面为整体流程代码:
源头:APP调用bindservice时,会进入下面的流程。
ContextImpl.java
->bindserviceCommon()
//获取AMS的服务,跨进程通信,走到AMS服务
->ActivityManager.getService().bindIsolatedService()
上面接口是进入ActivityManager.java的getService():
->获取服务的过程是获取AMS的binder的接口,为IActivityManager,是一个内部类
final IBinder b = ServiceManager.getService(context.ACTIVITY_SERVICE);
//也是通过asInterface转化为proxy这个给客户端用的binder代理
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
然后开始调用bindIsolatedService()了->ActivityManagerService的接口
ActivityManagerService.java:bindIsolatedService()
mServices.bindServiceLocked();
requestServiceBindingLocked();
-->ServiceRecord r; //对象表示一个Service.
//跳转到ActivityThread.java,其中app.thread是进入ActivityThread.java的main()去创建
r.app.thread.scheduleBinderService();
//向ActivityThread发消息,转到ActivityThread.HandleBindService()去处理消息。
sendMessage(H.BIND_SERVICE,s);
//上面的r.app.thread的创建过程。
ActivityThread.java的main():
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
ActivityThread.java->handleBindService():
//目的是要把AMS的binder传给APP,即Activity.
//拿到AMS的binder,然后调用它的publishService方法将Server端的binder送出去。
IBinder binder = s.onBind(data.intent);
ActivityManager.getService().publishService(binder);
//这里就进入AMS的publishService(binder)方法:
mServices.publishServiceLocked(service);
b.binder = service //上面的IBinder对象binder.
b.request = true;
connectionRecord c = clist.get(i) ;//获取
c.conn.connected(r.name, service, false); //调用activity中的connected接口回调onServiceConnected方法