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);
}
}
}
}
在方法中可以看到开始修改数据库默认直,下面一个是建立网络连接和清除所有连接