根据自己的一些理解有绘制如下Telephony架构图,其中有些遗漏并且也没有将一些功能汇入比如CallTracker,DataConnectionTracker等,这些也是其中比较关键的因素
以后有机会会陆续加入,可伴随着图后注解一起阅读。
1.Phone App通过Phone服务向外部提供如dial,showCallScreen,endCall等接口给外部程序,如Contacts.PhoneInterfaceManager是实现ITelephony并提供了Phone服务。Frameworks/base/telephony/java/com/android/internal/telephony/Itelephony.aidl
2.Phone程序在PhoneApp启动后调用PhoneFactory去创建PhoneBase,实例化CallManager并调用其registerPhone向Phonebase中注册消息监听。这些回调都是与Call相关的比如NewRingingConnection,CallWaiting等等。
3.TelephonyManager是Android提供给外部程序注册消息监听的接口。其主要通过TelephonyRegistry提供的registry服务去注册SIGNAL_STRENGTH,CALL_STATE等事件。并通过之前Phone App提供的Phone(Itelephony)服务去向外部应用程序提供取得Phonebase各种状态的接口。
4.TelephonyRegistry是在SystemServer启动后被注册的服务,此服务用于向外部程序提供registry服务,但一般应用程序多用TelephonyManager所封装的接口去监听事件改变。
5.PhoneNotifier是被每个phonebase保有的一个向外通知的接口。当phonebase接收到从ServiceStateTracker,CallTracker等传入的状态改变后便通过PhoneNotifier通知外部的TelephonyRegistry服务。其实有很多RIL消息并非都由PhoneBase去做处理,而是交由各事件单位去做单独处理,比如Call状态的改变会先由CallTracker去处理,比如其构造时会先调用ril的registerForCallStateChanged去注册RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED事件,当事件发生后会交由CallTracker处理,CallTracker将轮询每个call的状态,并把结果通知PhoneBase,PhoneBase将会调用PhoneNotifier去通知TelephonyRegistry服务。