binder java_Binder.java类别的角色,你了解吗

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沟通了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
com.miui.frameworks.servicestests (1 Test) [1/1] com.android.server.location.gnss.hal.Gpo4ClientTest#init: FAILED (141ms) STACKTRACE: java.lang.SecurityException: uid 10289 does not have android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION. at android.os.Parcel.createExceptionOrNull(Parcel.java:3011) at android.os.Parcel.createException(Parcel.java:2995) at android.os.Parcel.readException(Parcel.java:2978) at android.os.Parcel.readException(Parcel.java:2920) at android.location.ILocationManager$Stub$Proxy.registerLocationListener(ILocationManager.java:1291) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:1551) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:1234) at android.location.LocationManager.requestLocationUpdates(LocationManager.java:1199) at com.android.server.location.gnss.hal.Gpo4Client.registerPassiveLocationUpdates(Gpo4Client.java:198) at com.android.server.location.gnss.hal.Gpo4Client.init(Gpo4Client.java:78) at com.android.server.location.gnss.hal.Gpo4ClientTest.init(Gpo4ClientTest.java:209) ... 8 trimmed Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.location.LocationPermissions.enforceLocationPermission(LocationPermissions.java:116) at com.android.server.location.LocationManagerService.registerLocationListener(LocationManagerService.java:786) at android.location.ILocationManager$Stub.onTransact(ILocationManager.java:582) at android.os.Binder.execTransactInternal(Binder.java:1285) at android.os.Binder.execTransact(Binder.java:1249)
06-01

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值