欢迎使用CSDN-markdown编辑器
来源:互联网 发布:c语言汉诺塔问题解释 编辑:程序博客网 时间:2024/05/21 02:19
class MountService extends IMountService.Stub
implements INativeDaemonConnectorCallbacks, Watchdog.Monitor {}
在frameworks\base\core\java\android\os\storage下找到IMountService.java,竟然不是.aidl。原来在android2.x时代是aidl,现在直接就是java
看IMountService 就学习一下Binder这个知识:
public interface IMountService extends IInterface {
/* Local-side IPC implementation stub class. /
public static abstract class Stub extends Binder implements IMountService {
private static class Proxy implements IMountService {
private final IBinder mRemote;
Proxy(IBinder remote) { mRemote = remote; } public IBinder asBinder() { return mRemote; } public String getInterfaceDescriptor() { return DESCRIPTOR; } /** * Registers an IMountServiceListener for receiving async * notifications. */ public void registerListener(IMountServiceListener listener) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); try { _data.writeInterfaceToken(DESCRIPTOR); _data.writeStrongBinder((listener != null ? listener.asBinder() : null)); mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0); _reply.readException(); } finally { _reply.recycle(); _data.recycle(); } }
。。。
public static IMountService asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (iin != null && iin instanceof IMountService) {
return (IMountService) iin;
}
return new IMountService.Stub.Proxy(obj);
}
。。。
}
我们正常使用远端服务时经常使用这个方法asInterface。
这个位置我不清楚应该从第一处还是第二处返回。关于第一处的信息如下,待分析。
public Stub() {
attachInterface(this, DESCRIPTOR);
}
attachInterface这个方法里才会设置此Binder所属Interface
public void attachInterface(IInterface owner, String descriptor) {
mOwner = owner;
mDescriptor = descriptor;
}
从第二处返回的话则创建一个Proxy,他的每一个方法如下:
public void registerListener(IMountServiceListener listener) throws RemoteException {
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeStrongBinder((listener != null ? listener.asBinder() : null));
mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0);
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
其中mRemote即return new IMountService.Stub.Proxy(obj);中的obj,此处应该就是IMountService.Stub类型的对象,
来看看IMountService.Stub的onTransact方法
@Override
public boolean onTransact(int code, Parcel data, Parcel reply,
int flags) throws RemoteException {
switch (code) {
case INTERFACE_TRANSACTION: {
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_registerListener: {
data.enforceInterface(DESCRIPTOR);
IMountServiceListener listener;
listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
registerListener(listener);
reply.writeNoException();
return true;
}
。。。
}
调用他的registerListener方法,这是IMountService.Stub实现类的本地方法,即MountService方法
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 新技巧
- Oracle 诊断一例 ADDM Reports Significant Virtual Memory Paging
- .NET ORM 介绍
- sql server日期时间转字符串
- pdf分割合并工具下载和使用
- 欢迎使用CSDN-markdown编辑器
- 好记性不如烂笔头系列:编译ko模块相关
- request网络访问请求
- POJ1789 Truck History 最小生成树
- 查看程序崩溃时的调用堆栈错误
- VA01/VA02/VA03 屏幕增强
- 预习报告
- JDK等几个软件linux下安装的环境变量
- POST请求