Binder.java是Android应用框架里的重要组件,由于它提供了IBinder接口,让Activity等组件能透过IBinder接口而远程呼叫应用程序里的Service组件。对于Binder.java类别,我们可以从不同角度来看它所扮演的角色。
从应用程序的Service组件来看,Binder.java就扮演Service的接口对象角色。当Activity类别想呼叫远程的Service类别之函数时,可要求Service类别诞生一个Binder.java类别的对象,由它提供IBinder接口给Activity组件,就搭起Activity与Service组件之间的沟通桥梁了。
从IPC(Inter-Process Communication)角度来看,上述的沟通桥梁是跨进程的IPC沟通机制。Binder.java会透过JNI接口与本地(Native)的底层Binder服务沟通合作。在Activity和Service所在的进程之间建立Proxy/Stub机制,以完成Activity与Service之间的连结(Connection)。一旦完成连结之后,Activity就能透过IBinder接口而呼叫Service的函数,Proxy/Stub机制还会进行跨进程的Marshalling动作,协助Activity与Service之间跨进程的数据交换。
从框架(Framework)的角度来看,他只是Android里的BBinder.cpp类别在Java层的一个代表者,它以父类别(Superclass)形式出现,提供给Java层的应用类别(如myBinder.java)来继承,协助底层的Binder System(设计在先)能取得应用类别(设计在后)的客制化部分的信息。例如有了Binder.java的协助,Binder System得以从呼叫Service的onBind()函数而得知如何呼叫myBinder.java所客制化的onTransact()函数,如此让Android框架幕后的Binder System能与目前的myBinder.java应用类别结合起来,而达到框架的目的了。
表面上,myActivity.java类别(Activity.java的子类别)呼叫myBinder.java(Binder.java的子类别)的transact()函数及onTransact()函数,在实践机制里,myActivity.java是透过Connection对象去与BBinder.cpp沟通,然后BBinder.cpp才返向呼叫myBinder.java里的transact()和execTransact()等函数。由于myActivity.java与myService.java之呼叫是透过BBinder.java等底层对象来达成的,它们之间进行数据交换时,底层就有机会进行Marshalling动作,而达成IPC沟通了。
我是阿宝,喜欢的简书作者是周灿,愿与你分享更多有用有趣的内容。❤️
如果对你有用,点个赞或关注再走吧,你的一小步,阿宝离梦想的一大步。