APP调用bindService的跨进程调用过程

app执行bindService时会经过如下8次跨系统进程调用过程:

APP调用bindService的跨进程调用过程_第1张图片

第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方法

你可能感兴趣的:(Android系统,android,binder)