关于android 的数据开关项源码分析

android中数据开关的属性是"ro.com.android.mobiledata"

在Settings模块里,源码在:packages/services/Telephony/src/com/android/phone/MobileNetworkSettings.java文件中的mButtonDataEnabled = (CheckBoxPreference) prefSet.findPreference(BUTTON_DATA_ENABLED_KEY);

初始化控件在onResume()中的mButtonDataEnabled.setChecked(cm.getMobileDataEnabled());

cm是ConnectivityManager对象,

ConnectivityManager.java源码路径:frameworks/base/core/java/android/net

在设置中我们调用的方法在ConnectivityManager.java

public void setMobileDataEnabled(boolean enabled) {
        try {
            mService.setMobileDataEnabled(ActivityThread.currentPackageName(), enabled);
        } catch (RemoteException e) {
        }
    }

mService是IConnectivityManager对象, IConnectivityManager继承了ConnectivityService的接口,在ConnectivityService的方法中如下:

 public void setMobileDataEnabled(String callingPackage, boolean enabled) {
        enforceChangePermission();
        if (DBG) log("setMobileDataEnabled(" + enabled + ")");


        AppOpsManager appOps = (AppOpsManager)mContext.getSystemService(Context.APP_OPS_SERVICE);
        int callingUid = Binder.getCallingUid();
        if (appOps.noteOp(AppOpsManager.OP_DATA_CONNECT_CHANGE, callingUid, callingPackage) !=
            AppOpsManager.MODE_ALLOWED)
            return;


        mHandler.sendMessage(mHandler.obtainMessage(EVENT_SET_MOBILE_DATA,
                (enabled ? ENABLED : DISABLED), 0));
    }


其中  enforceChangePermission();
        if (DBG) log("setMobileDataEnabled(" + enabled + ")");


        AppOpsManager appOps = (AppOpsManager)mContext.getSystemService(Context.APP_OPS_SERVICE);
        int callingUid = Binder.getCallingUid();
        if (appOps.noteOp(AppOpsManager.OP_DATA_CONNECT_CHANGE, callingUid, callingPackage) !=
            AppOpsManager.MODE_ALLOWED)
            return;

都是跟权限相关的东西,其中那个handle调用的是

 private void handleSetMobileData(boolean enabled) {
        if (mNetTrackers[ConnectivityManager.TYPE_MOBILE] != null) {
            if (VDBG) {
                log(mNetTrackers[ConnectivityManager.TYPE_MOBILE].toString() + enabled);
            }
            mNetTrackers[ConnectivityManager.TYPE_MOBILE].setUserDataEnable(enabled);
        }
        if (mNetTrackers[ConnectivityManager.TYPE_WIMAX] != null) {
            if (VDBG) {
                log(mNetTrackers[ConnectivityManager.TYPE_WIMAX].toString() + enabled);
            }
            mNetTrackers[ConnectivityManager.TYPE_WIMAX].setUserDataEnable(enabled);
        }
    }

上下分别是3G和4G对应的数据,mNetTrackers是NetworkStateTracker一个对象数组,都调用了setUserDataEnable这个方法,

NetworkStateTracker是一个接口,应该在它的子类中的方法,BaseNetworkStateTracker继承了NetworkStateTracker,但是对应的方法是空的,并没有实现,

MobileDataStateTracker继承BaseNetworkStateTracker,对应的方法是

public void setUserDataEnable(boolean enabled) {
        if (DBG) log("setUserDataEnable: E enabled=" + enabled);
        final AsyncChannel channel = mDataConnectionTrackerAc;
        if (channel != null) {
            channel.sendMessage(DctConstants.CMD_SET_USER_DATA_ENABLE,
                    enabled ? DctConstants.ENABLED : DctConstants.DISABLED);
            mUserDataEnabled = enabled;
        }
        if (VDBG) log("setUserDataEnable: X enabled=" + enabled);
    }

最终的数据处理在DcTrackerBase类中CMD_SET_USER_DATA_ENABLE

  case DctConstants.CMD_SET_USER_DATA_ENABLE: {
                final boolean enabled = (msg.arg1 == DctConstants.ENABLED) ? true : false;
                if (DBG) log("CMD_SET_USER_DATA_ENABLE enabled=" + enabled);
                onSetUserDataEnabled(enabled);
                break;
            }

调用了onSetUserDataEnabled(enabled);方法,

protected void onSetUserDataEnabled(boolean enabled) {
        synchronized (mDataEnabledLock) {
            if (mUserDataEnabled != enabled) {
                mUserDataEnabled = enabled;
                Settings.Global.putInt(mPhone.getContext().getContentResolver(),
                        Settings.Global.MOBILE_DATA, enabled ? 1 : 0);
                if (getDataOnRoamingEnabled() == false &&
                        mPhone.getServiceState().getRoaming() == true) {
                    if (enabled) {
                        notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
                    } else {
                        notifyOffApnsOfAvailability(Phone.REASON_DATA_DISABLED);
                    }
                }


                if (enabled) {
                    onTrySetupData(Phone.REASON_DATA_ENABLED);
                } else {
                    onCleanUpAllConnections(Phone.REASON_DATA_DISABLED);
                }
            }
        }
    }

在方法中可以看到开始修改数据库默认直,下面一个是建立网络连接和清除所有连接

猜你喜欢

转载自blog.csdn.net/ZhangChengHai/article/details/41347891