Android 4.0 framework 数据业务学习总结(1)
简介
本条目用于记录本人对Android framework侧数据业务的阶段学习总结。
内容包括流程图,代码分析,BUG用例等。
第一阶段学习成果
本阶段主要注重对数据连接设置管理流程的学习,掌握数据业务的基本流程与构造。同时尝试解决部分简单BUG。
数据连接设置管理介绍
通过Setting的常规设置页面中的数据连接开关,打开/关闭数据连接业务。
数据业务设置完成后如何更新到status bar上。
开机后如何自启动数据业务。
这些过程是基本数据业务之一。
数据连接设置管理流程图
数据连接设置管理代码分析
通过Settings控制数据连接开关
Settings.java文件提供动作的入口。通过ConnectivityManager实例的setMobileDataEnable方法设置此开关。
/**
* Invoked on each preference click in this hierarchy, overrides
* PreferenceActivity's implementation. Used to make sure we track the
* preference click events.
*/
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
/** TODO: Refactor and get rid of the if's using subclasses */
...
} else if (preference == mButtonDataEnabled) {
if (DBG) log("onPreferenceTreeClick: preference == mButtonDataEnabled.");
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setMobileDataEnabled(mButtonDataEnabled.isChecked());
return true;
...
}
这个方法实际上调用的是ConnectivityService实例的setMobileDataEnable方法。
/**
* @see ConnectivityManager#setMobileDataEnabled(boolean)
*/
public void setMobileDataEnabled(boolean enabled) {
enforceChangePermission();
if (DBG) log("setMobileDataEnabled(" + enabled + ")");
mHandler.sendMessage(mHandler.obtainMessage(EVENT_SET_MOBILE_DATA,
(enabled ? ENABLED : DISABLED), 0));
}
通过Handler回调机制,我们在handleMessage对消息EVENT_SET_MOBILE_DATA进行处理。
走到了handleSetMobileData方法中。
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);
}
}
该方法根据传入的动作(enable or disable),设置对应的networkStateTracker标志位状态。
起作用的方法也就是MobileDataStateTracker实例的setUserDataEnable方法。
@Override
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);
}
同样使用了Handler的回调机制,通过回调之后的消息
DctConstants.CMD_SET_USER_DATA_ENABLE找到对应的在DataConnectionTracker里的Handler处理方法线程。
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()中
protected void onSetUserDataEnabled(boolean enabled) {
synchronized (mDataEnabledLock) {
final boolean prevEnabled = getAnyDataEnabled();
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) {
&nb
补充:移动开发 , Android ,