读书人

Android数据联接浅析

发布时间: 2013-01-27 13:56:15 作者: rapoo

Android数据连接浅析

在Android中,应用对数据连接的操作需要通过framework提供的以下两个服务类frameworks/base/services/java/com/android/server/ConnectivityService数据连接的系统级服务类,frameworks/base/core/java/android/net/ConnectivityManager数据连接的应用层管理类。下面就ConnectivityService的建立和彩信请求建立数据连接的过程做简单描述,欢迎有兴趣的朋友一起交流讨论。

1,ConnectivityService的启动,和驻留系统进程。
系统启动时,在SystemServer中调用ConnectivityService.getInstance(Context context)获取实例,
再将其加入ServiceManager,常驻系统进程。
connectivity = ConnectivityService.getInstance(context);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);

获取ConnectivityService实例时,调用的是内部的一个Thread。这里使用thread来创建ConnectivityService实例,可想而知实例化时做了很多耗时操作。
public static ConnectivityService getInstance(Context context) {
return ConnectivityThread.getServiceInstance(context);
}

在该thread的run中来实例化ConnectivityService,为此线程还添加了looper循环,提供给ConnectivityService实例化时的消息队列使用,消息队列需要looper循环的支持。

    protected void onEnableNewApn() {        // change our retry manager to use the appropriate numbers for the new APN        if (mRequestedApnType.equals(Phone.APN_TYPE_DEFAULT)) {            mRetryMgr = mDefaultRetryManager;        } else {            mRetryMgr = mSecondaryRetryManager;        }        mRetryMgr.resetRetryCount();        log("onEnableNewApn REASON_APN_SWITCHED");        if (isAllPdpDisconnectDone()) {            trySetupData(Phone.REASON_APN_SWITCHED);        } else {            cleanUpConnection(true, Phone.REASON_APN_SWITCHED);        }    }

此处的log("onEnableNewApn REASON_APN_SWITCHED"),还有trySetupData下的log("***trySetupData due to " + (reason == null ? "(unspecified)" : reason)),以及cleanUpConnection下的log("Clean up connection due to " + reason);
几条Log都可以做为底层建立数据连接的标识。


数据连接建立主要分三个过程:
1,上层应用通过ConnectivityMananger请求ConnecivityService对数据网络进行操作,包括建立,停止等操作。
2,ConnectivityService根据传入的网络类型,调用系统启动时创建的NetworkStateTracker建立数据连接,NetworkStateTracker调用Phone模块相关代码切换所请求数据连接的apn.
3,Phone模块再调用Framework下telephony模块的数据连接相关类,数据连接类再通过ril和Modem通信完成数据连接建立。





读书人网 >Android

热点推荐