您的位置:首页 > 大数据 > 人工智能

AIDL 源码窥探

2015-10-23 16:04 411 查看

AIDL 源码窥探



ITelephony.adil:

是一个接口,定义了方法,操作的数据是基本数据类型

interface ITelephony {

void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
void method();
}

ITelephony.java :

会由IDE自动生成的java文件.

ITelephony接口:继承了系统的IInterface接口

public interface ITelephony extends android.os.IInterface
{....}

IInterface 接口:

public interface IInterface
{
public IBinder asBinder();
}

Stub抽象内部类(在ITelephony接口中):继承了Binder和ITelephony接口

public static abstract class Stub extends android.os.Binder implements com.android.internal.telephony.ITelephony{

asBinder() //return this; !!!
asInterface(android.os.IBinder obj) //创建了一个new Proxy (obj)并返回 !!!!
}

Proxy代理类(在Stub中):持有Stub,并实现了ITelephony接口,通过它(代理类)调用Stub对象的方法。

private static class Proxy implements com.android.internal.telephony.ITelephony
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
//
}
asBinder() //return mRemote;
}

服务端:

在实现的Service子类中 : 返回一个继承Binder,实现AIDL接口的Stub对象

@Override
public IBinder onBind(Intent intent) {

return  new ITelephony.Stub() {...实现方法...};
}

客户端: 将mBinder(由服务端创建返回)转换成一个AIDL的接口对象(代理类对象)。

ITelephony telephonyService = ITelephony.Stub.asInterface(mBinder);

所有的Manager,都是通过ServiceManager获取到IBinder,然后让所有的Manager包装这个IBinder而成的。而ServiceManager里有两个成员:IServiceManager sServiceManager 和 HashMap sCache ,由此可以对IBinder进行添加,获取等操作

I开头的都是AIDL文件。

服务端:返回实现的 IBinder 对象,new IAIDL.Stub( ){....}

客户端:对返回的IBinder对象转成代理使用,IAIDL.Stub.asInterface(mIBinder)

ActivityManager:

IUsageStats usageStatsService = IUsageStats.Stub.asInterface(
ServiceManager.getService("usagestats")

TelephonyManager:

ITelephonyRegistry.Stub.asInterface (ServiceManager.getService(
"telephony.registry")

DevicePolicyManager:

IDevicePolicyManager.Stub.asInterface(
ServiceManager.getService(device_policy)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: