Android6.0 Telephony流程分析——数据连接Enable过程

数据连接有两个操作,打开或者关闭,本文分析的数据连接打开的过程,先附上时序图,Android6.0 Telephony流程分析——数据连接Enable过程_第1张图片

此图只是打开数据连接开关的主要过程,仅供参考。


step2,PhoneInterfaceManager是ITelephony的服务端。

step3,根据SIM卡的情况,选择GSMPhone或者CDMAPhone,这两phone的setDataEnabled都是step4。

step5,通知modem,打开数据连接。

step7,这里需要保存打开或者关闭数据连接这个操作,并且区分两个操作。

protected void onSetUserDataEnabled(boolean enabled) {
        synchronized (mDataEnabledLock) {
            if (mUserDataEnabled != enabled) {
                mUserDataEnabled = enabled;

                // For single SIM phones, this is a per phone property.
                if (TelephonyManager.getDefault().getSimCount() == 1) {
                    Settings.Global.putInt(mResolver, Settings.Global.MOBILE_DATA, enabled ? 1 : 0);
                } else {
                    int phoneSubId = mPhone.getSubId();
                    Settings.Global.putInt(mResolver, Settings.Global.MOBILE_DATA + phoneSubId,
                            enabled ? 1 : 0);
                }

                /// M:
                setUserDataProperty(enabled);
                notifyMobileDataChange(enabled ? 1 : 0);

                SubscriptionController subController = SubscriptionController.getInstance();
                final int defaultDataPhoneId = subController.getPhoneId(
                        subController.getDefaultDataSubId());
                int curPhoneId = mPhone.getPhoneId();

                if (defaultDataPhoneId != curPhoneId) {
                    log("Current phone is not default phone");
                    return;
                }
                // M: }@

                ...........

               mSettingProviderRetryCount = 0;

                if (getDataOnRoamingEnabled() == false &&
                        mPhone.getServiceState().getDataRoaming() == true) {
                    if (enabled) {
                        notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
                    } else {
                        notifyOffApnsOfAvailability(Phone.REASON_DATA_DISABLED);
                    }
                }

                if (enabled) {
                    onTrySetupData(Phone.REASON_DATA_ENABLED);//打开数据连接
                } else {//关闭数据连接
                    boolean isBsp = SystemProperties.getBoolean("ro.mtk_bsp_package", false);
                    if (isBsp) {
                        onCleanUpAllConnections(Phone.REASON_DATA_SPECIFIC_DISABLED);
                    } else {
                         for (ApnContext apnContext : mApnContexts.values()) {
                            if (!isDataAllowedAsOff(apnContext.getApnType())) {
                                apnContext.setReason(Phone.REASON_DATA_SPECIFIC_DISABLED);
                                onCleanUpConnection(true, apnTypeToId(apnContext.getApnType())
                                        , Phone.REASON_DATA_SPECIFIC_DISABLED);
                            }
                        }
                    }
                }
            }
        }
    }


step8~step10,根据APN类型优先级,查找可以连接的ApnContext.

                if (apnContext.isConnectable()) {
                    log("setupDataOnConnectableApns: isConnectable() call trySetupData");
                    apnContext.setReason(reason);
                    trySetupData(apnContext, waitingApns);
                }


step11~step12,找到ApnContext后,就根据APN类型、mccmnc、射频状态查找合适的ApnSetting(具体的apn参数)。

step16~step21,新建一个具体的数据连接DataConnection(也可能复用之前的),并用DcAsyncChannel将其与DcTracker连接起来。

step23~step27,进入DataConnection包含的第一个状态DcInactiveState(DataConnection初始化时已经进入这个状态了),开始真正的数据拨号,向modem发出请求,紧接着DataConnection进入DcActivatingState状态。

step29~step31,step27的返回结果在DcActivatingState状态处理,若成功,则进入DcActiveState状态,如果数据连接一直不断开,那就一直保持在这个状态。

step33~step42,真正实现网络的管理,路由的配置、物理网络的联通。

step45,我们看到状态栏上下行数据就是这里获得并发出去的。




未完待续,有不对的地方,请指正。

你可能感兴趣的:(Android,Telephony分析)