安卓的Telephony模块中大量的使用了AIDL,( AIDL(Android Interface Definition Language),即"Android接口定义语言"。是Android中进行进程间通信的一种解决方案,其本质是Android的Binder机制)。<br /> 在Telephony模块中,在ITelephony.aidl的文件路径是frameworks/base/telephony/java/com.android.internal.telephony.ITelephony.aidl.这里主要定义了com.android.phone进程中对外提供的telephony 的接口,它的服务端是PhoneInterfaceManager.java,它的文件路径为packages/Telephony/com.phone.PhoneInterfaceManager.java,它继承实现了ITelephony.Stub。<br />通过源码查找分析, 我们知道PhoneInterfaceManager的init()方法会在PhoneGlobals类的onCreate()方法中被调用。PhoneGlobals的源码路径:packages/Telephony/com.phone.PhoneGlobals.java.而PhoneGlobals的作用是在电话进程中运行时,持有电话子系统的全局状态。它在PhoneApp的onCreate中被创建。PhoneApp是继承自Application的,当Phone Service 启动时,就会创建PhoneGlobals实例,然后初始化PhoneInterfaceManager,总之就是com.android.phone 系统服务进程启动时,PhoneInterfaceMamager也会初始化。<br /> Itelephony.aidl主要在TelephonyManager(framework/base/telephony/java/android/telephony/TelephonyManager.java)中使用,TelephonyManager绝大多数公共方法,都会先调用
ITelephony telephony = getITelephony();
getITelephony该方法如下:
private ITelephony getITelephony() {
return ITelephony.Stub.asInterface(TelephonyFrameworkInitializer
.getTelephonyServiceManager().getTelephonyServiceRegisterer().get());
}
所以TelephonyManager是ITelephony的客户端,在第三方应用开发中,通过获取TelephonyManager实例,再调用相关API方法,实现和com.android.phone系统服务进程的通信。
和ITelephony.aidl一样机制的还有如下:
AIDL() | 实现 | 文件路径 |
---|---|---|
ITelephony | PhoneInterfaceManager | packages/services/Telephony/ |
ITelephonyRegistry.aidl | TelephonyRegistry.java | frameworks/base/services/core/ |
IPhoneSubInfo | PhoneSubInfoController | frameworks/opt/telephony/ |
ICarrierConfigLoader | CarrierConfigLoader | packages/services/Telephony/ |
ISub | SubscriptionController | frameworks/opt/telephony/ |
ITelecomService | TelecomServiceImpl中的mBinderImpl | packages/services/Telecomm/ |