您的位置:首页 > 移动开发 > Android开发

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

2014-11-21 13:44 716 查看
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);

}

}

}

}

在方法中可以看到开始修改数据库默认直,下面一个是建立网络连接和清除所有连接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: