2.3状态转换
上一小节中,调用onConnect 方法拨号后就接着调用transitionTo方法进入了DcActivatingState状态,
当RIL收到RIL_REQUEST_SETUP_DATA_CALL消息时, 将向DataConnection发送
EVENT_SETUP_DATA_CONNECTION_DONE的消息. DcActivatingState的processMessage方法
处理EVENT_SETUP_DATA_CONNECTION_DONE消息主要逻辑如下,
首先调用onSetupConnectionCompleted解析拨号结果,
ar = (AsyncResult) msg.obj;
cp = (ConnectionParams) ar.userObj;
DataCallResponse.SetupResult result = onSetupConnectionCompleted(ar);
然后根据拨号结果分别进行处理,
switch (result) {
case SUCCESS:
// All is well
mDcFailCause = DcFailCause.NONE;
transitionTo(mActiveState);
break;
case ERR_BadCommand:
•••
mInactiveState.setEnterNotificationParams(cp, result.mFailCause);
transitionTo(mInactiveState);
break;
•••
如果拨号成功就进入DcActiveState状态,
如果拨号过程中出现问题就进入DcInactiveState状态。
到此,和RIL交互已经告一段落了。接着看phone进程的处理。
直接分析正常的情况, DcActiveState状态。
DcActiveState进入时会调用enter方法, DcActiveState实现了自己的enter方法,如下,
首先通知其它APK,例如SystemUI,拨号成功。SystemUI会刷新界面的一些状态信息等等。
notifyAllOfConnected(Phone.REASON_CONNECTED);
当然,将信息传递给apk,一般有2种方法,
将相关信息通过广播发送出去,apk一般注册广播就可以了;
另外一种是通过回调接口,apk注册回调,直接监听状态就可以了。
但是对于phone信息,还可以通过TelephonyManager接口主动查询。
因此如何通知在此就不论述了。
然后更新DcNetworkAgent对象,通过DcNetworkAgent配置路由等,让终端可以真正的访问网络。对应的代码如下,
mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(),
"