下面为RIL工作框图:
呼叫转移中对RIL层返回的response,具体流程图如下
1. GsmCdmaPhone
一般向RIL请求request的类中含有对应的handleMessage方法会对RIL返回的response做出回应
在GsmCdmaPhone.handleMessage中如果消息为EVENT_GET_CALL_FORWARD_DONE则表示返回得到返回的消息,得到了呼叫转移的状态,
如果onComplete不为空,则发送消息,发送到3.GsmUmtsCallForwardOption的handler中,进行消息处理;
同时调用
GsmCdmaPhone.handleCfuqueryresult(CallForwardInfo[] infos)通知已经得到了呼叫转移的结果
2. SIMrecords
Phone.setVoiceCallForwardingFlag(int line, boolean enable)
R为IccRecords的实例,但IccRecords中的setVoiceCallForwardingFlag函数具体实现是在子类SIMrecords中。
SIMrecords为Iccrecords的子类,实际调用SIMRecords中的setVoiceCallForwardingFlag方法
3. RegistrantList消息机制
下面为消息的发送需要参考RegistrantList的消息处理机制
消息不断传递,最后在Registrant.java中的internalNotifyRegistrant方法中发送消息
代码中使用了RegistrantList,如何快速分析下一步流程走到哪里?
这是一个回调的过程,所以核心就是在哪里注册就在哪里处理,我们要找到调用register方法的地方。 我们看到在SIMRecords类中的
mRecordsEventRegistrants.notifyResult(EVENT_CFI);
先搜索mRecordsEventRegistrants,找到registerForRecordsEvent的方法;
再找到调用registerForRecordsEvent方法的地方,注册了事件EVENT_ICC_RECORD_EVENTS
最后搜索”EVENT_ICC_RECORD_EVENTS”,找到handleMessage()方法对消息的处理,所以下一步代码流程就应该是走这里了。
4. GamCdmaPhone.hangdleMessage
在GamCdmaPhone的hangdleMessage中有对以下消息的处理语句,可以看到会调用processIccRecordEvents方法
在GsmCdmaPhone.java中processIccRecordEvents
5. DefaultPhoneNotifier
notifyCallForwardingChanged方法为PhoneNotify接口的函数,具体实现在DefaultPhoneNotifier.java类中
6. TelephonyRegistry
调用TelephonyRegistry.java的notifyCallForwardingChangedForSubscriber
Callback为IPhoneStateListener,
看send
Handle传递消息LISTEN_CALL_FORWARDING_INDICATOR,处理消息在
PhoneStateListener中。
调用函数具体的实现代码,具体的实现过程要去看他的子类CallNotifierPhoneStateListener
7. CallNotifier
CallNotifierPhoneStateListener继承自PhoneStateListener,重写oncallForwardingIndicator-
-Changed方法;会调用updataPhoneStateListeners函数updataPhoneStateListeners函数中注册到Phone进程中
8.NotificationMgr
并且会调用函数updataCfi,此方法是用来发送通知 ,设置呼叫转移成功