Binder Class relation ship
来源:互联网 发布:网络组策略开通 编辑:程序博客网 时间:2024/05/16 01:32
public interface ICat extends android.os.IInterface{ public java.lang.String getColor() throws android.os.RemoteException; public double getWeight() throws android.os.RemoteException;/* 对于服务端不需要上述接口,调用通过消息解调得到 */ /** Local-side IPC implementation stub class. */====================================================================== stubStub提供了服务端的数据包解析,他需要本地的服务提供实际的数据。用户必须重载提供数据。 public static abstract class Stub extends android.os.Binder implements org.crazyit.service.ICat { private static final java.lang.String DESCRIPTOR = "org.crazyit.service.ICat"; /** Construct the stub at attach it to the interface. */ public Stub() { this.attachInterface(this, DESCRIPTOR); } /** * Cast an IBinder object into an org.crazyit.service.ICat interface, * generating a proxy if needed. */ public static org.crazyit.service.ICat asInterface(android.os.IBinder obj) { if ((obj==null)) { return null; } android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); if (((iin!=null)&&(iin instanceof org.crazyit.service.ICat))) { return ((org.crazyit.service.ICat)iin); } return new org.crazyit.service.ICat.Stub.Proxy(obj); } @Override public android.os.IBinder asBinder() { return this; } @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { switch (code) { case INTERFACE_TRANSACTION: { reply.writeString(DESCRIPTOR); return true; } case TRANSACTION_getColor: { data.enforceInterface(DESCRIPTOR); java.lang.String _result = this.getColor(); reply.writeNoException(); reply.writeString(_result); return true; } case TRANSACTION_getWeight: { data.enforceInterface(DESCRIPTOR); double _result = this.getWeight(); reply.writeNoException(); reply.writeDouble(_result); return true; } } return super.onTransact(code, data, reply, flags); } ×××××××××××××××××××××××××××××××××××××××××××××××××××××××× Proxy 运行在client空间,在client使用asInterface函数和远端IBinder构造 private static class Proxy implements org.crazyit.service.ICat { private android.os.IBinder mRemote; Proxy(android.os.IBinder remote) { mRemote = remote; } @Override public android.os.IBinder asBinder() { return mRemote; } public java.lang.String getInterfaceDescriptor() { return DESCRIPTOR; } @Override public java.lang.String getColor() throws android.os.RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); java.lang.String _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_getColor, _data, _reply, 0); _reply.readException(); _result = _reply.readString(); } finally { _reply.recycle(); _data.recycle(); } return _result; } @Override public double getWeight() throws android.os.RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); double _result; try { _data.writeInterfaceToken(DESCRIPTOR); mRemote.transact(Stub.TRANSACTION_getWeight, _data, _reply, 0); _reply.readException(); _result = _reply.readDouble(); } finally { _reply.recycle(); _data.recycle(); } return _result; } } ×××××××××××××××××××××××××××××××××××××××××××××××× Proxy static final int TRANSACTION_getColor = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); static final int TRANSACTION_getWeight = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); }}public class Binder implements IBinder { private IInterface mOwner; /× 存储了实际的接口对象,可以为自己 ×/ private String mDescriptor;}public interface IInterface{ public IBinder asBinder();}
关于Messenger的接口。
IMessenge.Proxy -> IMessenger -> IInterface (client side interface object)
IMessenge.Stub -> IMessenger -> IInterface (server side interface object)
IMessenge.Stub -> Binder -> IBinder
IMessenge.Proxy wrap pointer to IMessenge.Stub,the pointer maybe Binder
BinderProxy -> IBinder 可能是客户在本端的IBinder对象。
Handler <<– >> MessengerImpl -> IMessenger.Stub
Messenger ->> MessengerImpl –>> Handler
0 0
- Binder Class relation ship
- Relation
- model-ship ship-crafts
- ship shell
- hdu5093battle ship
- has a relation with model <class '***'>, which has either not been installed or is abstract.
- makefile relation
- Relation Model
- binder
- binder
- binder
- Binder
- binder
- binder
- Binder
- binder
- binder
- Binder
- jQuery Mobile移动网站开发
- 使用http协议访问svn
- linux基础 --- shell
- vc2008: 控制台程序将数据写入MySql(数据库信息从配置文件读取)
- selenium IDE 定时执行case及log保存的方法
- Binder Class relation ship
- java、memcached的配置及使用
- 纵横谈23种面向对象的设计模式--创建型
- app引导页(背景图片切换加各个页面动画效果)
- Linux系统中的SWAP分区
- java反射实现生成easyui中datagrid基础field
- 硬创先锋艾琪:宜准怎样从运动市场切入智能手表?
- 用java来实现列出指定目录下的文件,子目录下的文件也要输出
- Mybatis模糊查询