当前位置:操作系统 > 安卓/Android >>

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,