系统APN开关的初始状态

系统APN开关的初始状态:

1.mobile data enabled
frameworks/base/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
初始化时有读取dataEnabledSetting,
dataEnabledSetting = IConnectivityManager.Stub.asInterface(ServiceManager.             
               getService(Context.CONNECTIVITY_SERVICE)).getMobileDataEnabled();
这里会一直调用到
frameworks/base/services/java/com/android/server/ConnectivityService.java
    public boolean getMobileDataEnabled() {
        enforceAccessPermission();
        boolean retVal = Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Secure.MOBILE_DATA, 1) == 1;
        if (DBG) Slog.d(TAG, "getMobileDataEnabled returning " + retVal);
        return retVal;
    }
会从数据库Settings的Secure表中读取mobile_data项的数值,该数据库在初始化时默认没有设置这一项,
因此会返回调用时的默认值1,也就是说android系统在代码中写死了,默认mobile_data是enabled的

2.settings的APN网络开关checkbox
packages/apps/Phone/ApnSwitchCheckBoxPreference.java
ApnSwitchCheckBoxPreference类初始化时读取初始指:
        boolean apnEnabled = true;
        mResolver = context.getContentResolver();
        try {
            apnEnabled = android.provider.Settings.System.getInt(mResolver, APN_STATE) > 0 ? true : false;
            if(DBG) Log.i(LOG_TAG, "zhangwen: apnEnable=" + apnEnabled);
        } catch (SettingNotFoundException e) {
            // APN_STATE not found
            if(DBG) Log.i(LOG_TAG, "zhangwen: APN setting state not found");
        }
        setChecked(apnEnabled);
同样,Settings数据库中的System表中默认没有apn_state的设置,因此会异常,apnEnabled保持声明时的true初始指

初始化完成后还会调用updateSwitchState(),进行PREFERAPN_URI的query,
packages/providers/TelephonyProvider/src/com/android/providers/telephony/TelephonyProvider.java
当query URL_PREFERAPN(content://telephony/carriers/preferapn)时,
会先从本地的preference “preferred-apn”文件中读取apn_id,然后将该apn_id append到查询的uri后执行数据库查询。
该apn_id会有一个大于0的数值,因此会返回enabled状态。