Phone去电请求及响应(framework层)
打电话请求流程
1.进入键盘界面(TwelvekeyDialer),点击dialButton发送ACTION_CALL_PRIVILEGED动作来启动OutgoingCallBroadcaster.
2.OutgoingCallBroadcaster对紧急号码进行处理后发ACTION_NEW_OUTGOING_CALL广播,由内部类OutgoingCallReceiver接收,由该类来启动InCallScreen。
3.InCallScreen的onCreate中调用initInCallScreen初始化打电话界面,registerForPhoneStates注册电话状态监听,由内部Handler对象来处理监听(用于对底层的响应,在打电话响应流程中会使用),再调用internalResolveIntent,该方法中调用placeCall发送打电话请求。
4.placeCall中通过调用PhoneUtils的placeCall实现,PhoneUtils的placeCall再调用 GSMPhone的dial方法,该方法再调用GSMCallTracker.dial方法。而GSMCallTracker持有 CommandInterface对象,即RIL类的实例。RIL的dial方法对intent进一步处理,再调用自身的send方法发送 RILRequest对象,由内部类RILSender对象代理发送,该对象通过LocalSocket写入输出流中。套接字方法在 LocalSocketImpl中由native函数实现。
上述步骤即完成了从用户发送打电话请求到框架层向底层发送請求的流程,然后通过socket转到RIL层处理dial請求。
打电话响应流程
1.RIL中的内部类RILReceiver监听守护进程rild的上报,从套接字中读取上报信息,并依次调用readRilMessage,processResponse,processSolicited进行处理。
2.processSolicited方法向GSMCallTracker对象发送消息。GSMCallTracker对象的handlerMessage方法进行处理。接着调用updatePhoneState方法更新状态。
3.该方法调用GSMPhone.notifyPreciseCallStateChanged,进而调用RegistrantList对向的 intelNotifyRegistrants,该方法循环处理已经注册到RegistrantList中的事件,然后通过Registrants向注册的handler发送消息。
4.InCallScreen中注册的handler将会接收到消息,并来响应onPhoneStateChanged事件。该事件进而调用updateScreen来更新界面。
上述过程即完成了从RIL层到应用层的响应过程。
打电话的請求流程和响应流程基本涵盖了RIL层与应用层的消息传递流程。诸如来电流程及应答流程的通信方式基本相似。