SuperIC社区_

标题: Android应用程序绑定服务(bindService)的过程源代码分析(2) [打印本页]

作者: liuwei    时间: 2016-10-11 17:44
标题: Android应用程序绑定服务(bindService)的过程源代码分析(2)
这里的参数r就是我们在前面的Step 6中创建的ServiceRecord了,它代表刚才已经启动了的CounterService。函数requestServiceBindingsLocked调用了requestServiceBindingLocked函数来处理绑定服务的操作,而函数requestServiceBindingLocked又调用了app.thread.scheduleBindService函数执行操作,前面我们已经介绍过app.thread,它是一个Binder对象的远程接口,类型是ApplicationThreadProxy。
        Step 16. ApplicationThreadProxy.scheduleBindService
        这个函数定义在frameworks/base/core/java/android/app/ApplicationThreadNative.java文件中:


        这里像上面的Step 11一样,调用ActivityThread.queueOrSendMessage函数来发送消息。
        Step 18. ActivityThread.queueOrSendMessage
        参考上面的Step 11,不过这里的消息类型是H.BIND_SERVICE。
        Step 19. H.sendMessage
        参考上面的Step 12,不过这里最终在H.handleMessage函数中,要处理的消息类型是H.BIND_SERVICE:


        在前面的Step 13执行ActivityThread.handleCreateService函数中,已经将这个CounterService实例保存在mServices中,因此,这里首先通过data.token值将它取回来,保存在本地变量s中,接着执行了两个操作,一个操作是调用s.onBind,即CounterService.onBind获得一个Binder对象,另一个操作就是把这个Binder对象传递给ActivityManagerService。
        我们先看CounterService.onBind操作,然后再回到ActivityThread.handleBindService函数中来。
        Step 21. CounterService.onBind
        这个函数定义在应用程序Broadcast的工程目录下的src/shy/luo/broadcast/CounterService.java文件中:


         这里通过Binder驱动程序就进入到ActivityManagerService的publishService函数中去了。
         Step 23. ActivityManagerService.publishService
         这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:


        因此,这里可以从r.connecti**中将这个ConnectionRecord取出来:


         这里它将操作转发给ServiceDispatcher.connected函数。
         Step 25. ServiceDispatcher.connected
         这个函数定义在frameworks/base/core/java/android/app/LoadedApk.java文件中:


        这里的mCommand值为0,于是就执行ServiceDispatcher.doConnected函数来进一步操作了。
        Step 28. ServiceDispatcher.doConnected
        这个函数定义在frameworks/base/core/java/android/app/LoadedApk.java文件中:


        这里传进来的参数service是一个Binder对象,就是前面在Step 21中从CounterService那里得到的ConterBinder对象,因此,这里可以把它强制转换为CounterBinder引用,然后调用它的getService函数。
        至此,应用程序绑定服务过程中的第三步MainActivity.ServiceConnection.**erviceConnection就完成了。
        Step 30. CounterBinder.getService
        这个函数定义在应用程序Broadcast的工程目录下的src/shy/luo/broadcast/CounterService.java文件中:


        这里就把CounterService接口返回给MainActivity了。        至此,应用程序绑定服务过程中的第四步CounterService.CounterBinder.getService就完成了。        这样,Android应用程序绑定服务(bindService)的过程的源代码分析就完成了,总结一下这个过程:
        1. Step 1 -  Step 14,MainActivity调用bindService函数通知ActivityManagerService,它要启动CounterService这个服务,ActivityManagerService于是在MainActivity所在的进程内部把CounterService启动起来,并且调用它的onCreate函数;        2. Step 15 - Step 21,ActivityManagerService把CounterService启动起来后,继续调用CounterService的onBind函数,要求CounterService返回一个Binder对象给它;        3. Step 22 - Step 29,ActivityManagerService从CounterService处得到这个Binder对象后,就把它传给MainActivity,即把这个Binder对象作为参数传递给MainActivity内部定义的ServiceConnection对象的**erviceConnected函数;        4. Step 30,MainActivity内部定义的ServiceConnection对象的**erviceConnected函数在得到这个Binder对象后,就通过它的getService成同函数获得CounterService接口。





欢迎光临 SuperIC社区_ (/) Powered by Discuz! X3.3