关于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);
}
}
}
}
在方法中可以看到开始修改数据库默认直,下面一个是建立网络连接和清除所有连接
在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);
}
}
}
}
在方法中可以看到开始修改数据库默认直,下面一个是建立网络连接和清除所有连接
相关文章推荐
- Android中从源码分析关于AsyncTask的使用
- Android中从源码分析关于AsyncTask的使用
- android关于dispatchTouchEvent和onTouchEvent的源码实验分析
- Android 源码分析Application的生命周期及共享数据详解
- Android 数据Parcel序列化过程源码分析
- 关于Android 电话接通的时候,将proximity sensor开启的源码分析
- Android 7.0 Gallery图库源码分析3 - 数据加载及显示流程
- Android项目-智慧北京:02(三种技术设计主页面及源码分析点击事件传递的机制及Json数据传递的使用)
- Android中从源码分析关于AsyncTask的使用
- android系统源码分析——binder基础数据结构
- Android Camera 系统架构源码分析(5)---->Camera数据Buf的传递方式及相关类
- 【Android 数据业务解析】PreferredApn修改的源码分析
- 【开源中国Android客户端】源码分析 网络数据传输接口
- Android Jamendo开源在线音乐播放器源码分析七 数据缓存和图片缓存的分析
- Android源码分析系列-整理篇 ------ 关于Vold 自动挂载部分
- Android蓝牙源码分析——关于GKI
- 关于Android大数据收集,埋点统计的详细讲解以及案例代码分析附github代码
- Android Camera 系统架构源码分析(5)---->Camera数据Buf的传递方式及相关类
- 从源码上分析Android View保存数据状态
- android中关于ListView分页加载数据的分析