通过AIDL工具可以把IWallpaperService.aidl接口文件编译成IWallpaperService.java文件,此文件含一个进程间通讯的类IWallpaperService.Stub:
public static abstract class Stub extendsandroid.os.Binder implements android.service.wallpaper.IWallpaperService
该类包含了一个方法onTransact:
public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags){
return super.onTransact(code, data, reply, flags);
}
该类又包含了一个内部类Proxy:
private static class Proxy implements android.service.wallpaper.IWallpaperService
{
private android.os.IBinder mRemote;
mRemote.transact(Stub.TRANSACTION_attach, _data, null, android.os.IBinder.FLAG_ONEWAY);
.....................................................................
}
Proxy工作在客户端,通过transact把数据发送到Stub的onTransact方法进行处理,由此可见,
IWallpaperService的Stub类横跨了C/S的两个进程,其发送和处理请求均在此处理,这是在Binder驱动上对通信层面的一种抽象。
编译生成的相关文件路径如下:
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/service/wallpaper/IWallpaperService.P
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/service/wallpaper/IWallpaperService.java
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes/android/service/wallpaper/IWallpaperService.class
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes/android/service/wallpaper/IWallpaperService$Stub$Proxy.class
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes/android/service/wallpaper/IWallpaperService$Stub.class
后续将主要对以下几个问题进行学习:
1.应用程序要跨进程访问核心平台服务的方法。
2.同一个进程的不同线程间使用Binder机制(直接调用,不用经过Binder驱动)
3.应用程序间互相访问