时间:2014-01-30 来源:

Android2.3拨号上网流程从源码角度进行分析

通常web切图报价,如果我们想使用SIM卡拨号上网功能,web切图报价我们要在设置中进行简单的配置,psd转html步骤如下
设置 -》无线和网络 -》移动网络 -》(已启用数据/数据漫游/接入点名称/仅使用2G网络/网络运营商)
我们必须选中其中的“已启用数据”选项,html切图制作然后配置接入点名称后就可以上网了,html切图当然有的设置中已经根据你的SIM卡类型默认设置了接入点,wap前端外包这时候你只选择“已启用数据”项后就可以完成上网功能设置.
这些设置步骤究竟做了哪些事情呢?我们现在就从源码的角度进行分析.

1. 首先web前端制作,我们找到“移动网络”的设置UI-------Settings.java(/packages/apps/Phone/src/com/android/phone/Settings.java)
Settings.java:
"已启用数据"选项的相关代码如下:
复制代码 代码如下:

......
else if (preference == mButtonDataEnabled) {
if (DBG) log("onPreferenceTreeClick: preference == mButtonDataEnabled.");
ConnectivityManager cm =
(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
cm.setMobileDataEnabled(mButtonDataEnabled.isChecked());
return true;
}
......

代码中,web前端制作我们得到一个ConnectivityManager对象承接网页制作,并调用该对象的setMobileDataEnable(boolean b)方法,div前端切图根据传入的参数进行设置web切图报价,我们看一下ConnectivityManager类.

2. ConnectivityManager.java(/frameworks/base/core/java/android/net/ConnectivityManager.java)
这个时候,web切图报价数据已经进入frameworks层.
setMobileDataEnable()方法代码如下:
复制代码 代码如下:

IConnectivityManager mService;
......
 public ConnectivityManager(IConnectivityManager service) {
        if (service == null) {
            throw new IllegalArgumentException(
                "ConnectivityManager() cannot be constructed with null service");
        }
        mService = service;
    }
......
public void setMobileDataEnabled(boolean enabled) {
try {
mService.setMobileDataEnabled(enabled);
} catch (RemoteException e) {
}
}

这里我们要知道IConnectivityManager类符合w3c标准,是根据IConnectivityManager.aidl接口自动生成的一个java类,符合w3c标准而我们自己有一个Service则继承了该类的内部类:Stub,所以根据AIDL只是web前端制作,我们知道,web前端制作代码中的mService其实就是ConnectivityService类的对象承接网页制作, "setMobileDataEnabled(" + enabled + ")");
mHandler.sendMessage(mHandler.obtainMessage(EVENT_SET_MOBILE_DATA, 0));
}

这里发送了一个消息出去符合w3c标准,mHandler收到该消息以后:
复制代码 代码如下:

case EVENT_SET_MOBILE_DATA:
{
boolean enabled = (msg.arg1 == ENABLED);
handleSetMobileData(enabled);
break;
}

收到该消息后,符合w3c标准调用handleSetMobileData()方法:
复制代码 代码如下:

private NetworkStateTracker mNetTrackers[];
......
private void handleSetMobileData(boolean enabled) {
        ......
if (enabled) {
if (mNetTrackers[ConnectivityManager.TYPE_MOBILE] != null) {
if (DBG) {
Slog.d(TAG, "starting up " + mNetTrackers[ConnectivityManager.TYPE_MOBILE]);
}
mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect();
}
            ......
}
 }

如果“已启用数据”选项已经选择,wap前端外包那这个时候传进来的参数“enabled”应该是“true”,所以会处理代码中if语句块,div+css制作即执行:
复制代码 代码如下:

mNetTrackers[ConnectivityManager.TYPE_MOBILE].reconnect();

而在ConnectivityManager中承接网页制作,所以这里相当于调用了
复制代码 代码如下:

mNetTracker[0].reconnect()

但是web切图报价,NetworkStateTracker是一个抽象类,web切图报价所以具体的事情要交给它的子类MobileDataStateTracker.java来干.

4. MobileDataStateTracker.java(/frameworks/base/core/java/android/net/MobileDataStateTracker.java)
该类包含多种数据连接符合w3c标准,SUPL,DUN等,wap前端外包
在MobileDataStateTracker.java里面的调用流程是这样的:
复制代码 代码如下:

<PRE class=java name="code">mPhoneService = ITelephony.Stub.asInterface(ServiceManager.getService("phone"));</PRE>......<BR>
reconnect->mPhoneService.enableApnType(apnType);<P></P>
<PRE></PRE>
mPhoneService是电话的服务的客户端web前端制作,它的server端实际上是PhoneInterfaceManager对象
<P></P>
<P>5. PhoneInterfaceManager.java(/packages/apps/Phone/src/com/android/phone/PhoneInterfaceManager.java)<BR>
</P>
<P>看PhoneInterfaceManager的enableApnType方法:</P>
<P><PRE class=java name="code"> public int enableApnType(String type) {
enforceModifyPermission();
return mPhone.enableApnType(type);
}
</PRE><P></P>
这样,web前端制作就将连接apn的请求发送到telephony框架层下去了.apn在设置应用里面有指定承接网页制作,一般在你的工程目录下的system/etc/apns-conf.xml文件<BR>
<BR>
<P>6. 上面的mPhone是PhoneProxy对象,div前端切图</P>
<P>调用流程:</P>
<P>PhoneProxy.java:<BR>
</P>
<P><PRE class=java name="code">mActivePhone.enableApnType(type)</PRE>mActivePhone是GSMPhone或者CDMAPhone的上溯接口PhoneBase对象<BR>
<P></P>
<P>PhoneBase.java:</P>
<P><PRE class=java name="code">mDataConnection.enableApnType(type);</PRE><P></P>
<P>调用到 DataConnectionTracker的enableApnType方法</P>
<P>DataConnectionTracker.java:<BR>
</P>
<P>enableApnType(String type)->setEnabled->onEnableApn->onEnableNewApn<BR>
</P>
<BR>
<P>onEnableNewApn方法在DataConnectionTracker的派生类GsmDataConnectionTracker和CdmaDataConnectionTracker中实现web切图报价,从而区别不同类型PHONE的数据连接流程.<BR>
</P>
<P>以GSM为例,web切图报价调用流程:onEnableNewApn->cleanUpConnection->conn.disconnect<BR>
<BR>
</P>
conn是DataConnection对象符合w3c标准,标识一钟数据连接,符合w3c标准可以看出这里实际上实现了一个数据连接的状态机.<BR>
<P>在DataConnection对象里面数据连接的状态分为:</P>
<P><PRE class=java name="code">DcDefaultState,非激活状态.
DcActivatingState,激活状态
DcDisconnectingState,断开状态(因为错误的DNS)
</PRE><P></P>
<P>连接成功以后web切图报价,notifyDefaultData调用到DefaultPhoneNotifier的notifyDataConnection方法.</P>
<P>DefaultPhoneNotifier是ITelephonyRegistry接口的客户端,网站div+css其服务端是TelephonyRegistry(com.android.server.TelephonyRegistry)</P>
<P>TelephonyRegistry的notifyDataConnection方法调用如下语句<BR>
<PRE class=java name="code"> r.callback.onDataConnectionStateChanged(state, networkType);</PRE><P></P>
<P>r是当前mRecords中的元素,符合w3c标准包含有IPhoneStateListener接口的实现callback,TelephonyRegistry中的每个调用都会遍历mRecords中的元素,wap前端外包如果某个元素注册了对应接听web前端制作,</P>
<P>则调用callback的某个函数.</P>
<P>客户端通过如下方式调用取得电话状态的监听,div+css制作 以StatusBarPolicy.java中的mPhoneStateListener为例:</P>
<P>            ((TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE))</P>
<P>                    .listen(mPhoneStateListener,<BR>
                              PhoneStateListener.LISTEN_SERVICE_STATE<BR>
                            | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS<BR>
                            | PhoneStateListener.LISTEN_CALL_STATE<BR>
                            | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE<BR>
                            | PhoneStateListener.LISTEN_DATA_ACTIVITY);<BR>
</P>
<P>mPhoneStateListener是PhoneStateListener实例,承接网页制作PhoneStateListener实现了IPhoneStateListener接口web切图报价,假如你继承PhoneStateListener子类,web切图报价首先你要确定你感兴趣的监听</P>
<P>事件符合w3c标准, String incomingNumber)<BR>
</P>
<P>notifyDataConnection ------- PhoneStateListener.LISTEN_DATA_CONNECTION_STATE    ---   public void onDataConnectionStateChanged(int state, int networkType)<BR>
</P>
<P>notifyDataActivity  -------------- PhoneStateListener.LISTEN_DATA_ACTIVITY -----------------------   public void onDataActivity(int direction)<BR>
</P>
<P>........</P>
<P>因此整个调用链是:DefaultPhoneNotifier:notifyDataConnection ---------》 TelephonyRegistry :notifyDataConnection---------》</P>
<P>PhoneStateListener.callback:onDataConnectionStateChanged --------------》PhoneStateListener子类的onDataConnectionStateChanged</P>
<P>除此之外,wap前端外包TelephonyRegistry还发出一个ACTION_ANY_DATA_CONNECTION_STATE_CHANGED,包含数据连接的详细信息.</P>
<P><BR>
而Mobile Data Service里面的MobileDataStateTracker会接收到这个动作,web前端制作由它的BoadcastReceiver类MobileDataStateReceiver提取出数据连接的信息承接网页制作, reason, apnName);
</PRE>
<P>MobileDataStateTracker根据状态变化给ConnectivityService发送EVENT_STATE_CHANGED消息.</P>
<P>ConnectivityService调用handleConnect去执行相关炒作,web切图报价包括关闭优先级比它低的数据连接符合w3c标准,更新状态栏等等.<BR>
</P>
<P>还有很多地方还没有搞明白,符合w3c标准以后再续.<BR>
</P>
<P><BR>
</P>
<P><BR>
</P>
<BR>
<P><BR>
<BR>
</P>
点击次数:9694
作者:

其它web前端开发资讯

POJ1087网络流(最大流ISAP) 【互联网】2018年01月19日经典QQ网文你要结婚了,新娘不是我2018年01月19日华为预计未来五年营收年均增幅将达10%2018年01月19日Android之使用MediaMetadataRetriever类获取视频第一帧 【移动开发】2018年01月19日CodeforcesRound#313(Div.2)E.GeraldandGiantChess定理Lucas求大组合数【综合】2018年01月19日【C++】LeetCode:55DecodeWays 【编程语言】2018年01月19日ArchLinux安装XeroxPhaser3125N网络打印机备忘录 【编程语言】2018年01月19日JFreeChart在Struts2中实现饼状图统计 【编程语言】2018年01月19日word2013长篇文档排版案例教程【综合】2018年01月19日HLJOJ1214(最短路)【移动开发】2018年01月19日雷观(六):码农值千金 【互联网】2018年01月19日mysql-cacti-templates-1.1.2.tar.gz免费下载cactiMySQL增加监控【编程语言】2018年01月19日JavaFx2设置窗口图标. 【编程语言】2018年01月19日LeetCodeN-Queens【编程语言】2018年01月19日第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行:启动流程概览(原创) 【编程语言】2018年01月19日OCM_Session1_5_TablespaceCreationandConfigurationnote2018年01月19日
web前端行业资讯
Web new NewsList
微软发布WindowsServerBuild17074更新 ,,2018年01月18日凭借一个AI小功能,这款Google应用冲上苹果AppStore榜首 ,,2018年01月18日百度数据可视化实验室正式成立,发布深度学习可视化平台VisualDL ,,2018年01月18日OpenAI开源最新工具包,模型增大10倍只需额外增加20%计算时间 ,,2018年01月18日百度手机输入法8.0正式发布:支持多人语音速记 ,,2018年01月18日CSDN宣布收购TinyMind团队并升级为AI社区 ,,2018年01月18日甲骨文发布补丁修复英特尔芯片漏洞造成的问题 ,,2018年01月18日权威!官方发布CPU熔断和幽灵漏洞防范指引:附补丁下载 ,,2018年01月18日Oracle宣布新的JavaChampions ,,2018年01月18日腾讯加码区块链项目已悄然注册“以太锁”商标 ,,2018年01月18日Fedora28壁纸征集活动现已开幕:将持续至2月13日 ,,2018年01月18日苹果WebKit团队发布Speedometer2.0网页响应测试工具 ,,2018年01月18日百度输入法8.0后天发布:全感官AI输入 ,,2018年01月18日腾讯和乐高合作:共同研发智能玩具、游戏 ,,2018年01月18日HomePod上市日益临近智能音箱市场吸引力越来越大 ,,2018年01月18日3D打印脑组织?科学家正在向这一目标正在前进 ,,2018年01月18日英特尔公布修补漏洞后PC性能数据:8代CPU影响最小 ,,2018年01月18日云存储公司Dropbox秘密提交IPO申请估值超百亿美元 ,,2018年01月18日iPod之父:防手机上瘾无技术难度苹果谷歌应承担责任 ,,2018年01月18日芯片不安全英特尔云客户考虑转用AMD等对手处理器 ,,2018年01月18日2018年Java展望 ,,2018年01月18日区块链有多火?快播流量矿石遭20多万人疯抢 ,,2018年01月18日Intel搞定神经拟态芯片:模拟人类大脑、自主学习 ,,2018年01月18日阿里巴巴发布IoTConnect开放连接协议,盼推动语音互动入口普及 ,,2018年01月18日区块链火了,全球大佬们怎么看? ,,2018年01月18日Facebook正测试新功能主推本地新闻资讯 ,,2018年01月18日在GooglePlay中发现使用Kotlin开发的安卓恶意软件 ,,2018年01月18日VisualStudio201715.6预览版本2,增加新功能 ,,2018年01月18日百度陆奇:AI是5G最好的加速器 ,,2018年01月18日PinterestCEO:不同于谷歌和Facebook,我们走了第三条路 ,,2018年01月18日js操作符实例代码2014年01月29日JAVA学习笔记(五十七)-常用设计模式 【编程语言】2015年04月07日Mac下修改AndroidStudio所用的JDK版本 【综合】2015年06月11日安全的Web服务器,Hiawatha8.0发布 ,,2016年06月23日微调数字2014年01月29日计算一段日期内的周末天数的php代码(星期六,星期日总和)2014年01月29日iOS截取屏幕当前显示的图片(可按范围截取) 【移动开发】2015年07月02日Erase-remove惯用法 【编程语言】2015年03月09日让焦点自动跳转2014年01月29日VC如何(配置)启用内存泄漏检测【综合】2015年04月27日网站中的隐形炸弹eWebEditor文件上传漏洞补丁2014年01月29日【ObjectC】反射机制 【系统运维】2014年12月03日strutsajax多级下拉菜单 【移动开发】2015年03月30日applicationvnd.android.package-archive到底是什么 【互联网】2015年05月19日C++查缺补漏之const限定符及引用 【移动开发】2015年01月24日用javascript实现页面打印的三种方法2014年01月29日WMS仓库管理系统---(3)品牌管理模块 【编程语言】2015年01月29日苹果正式开通Instagram分享各种iPhone拍的美图 ,,2017年08月10日FastJson的使用 【编程语言】2015年09月01日3D游戏引擎StingRay:支持实时多平台研发 【研发管理】2015年03月13日网页设计中的广告字体设计2014年01月28日内核模块遍历进程和任务队列保存到proc文件中 【Web前端】2015年05月18日vector容器常用方法 【编程语言】2015年06月26日c语言之统计元音【综合】2015年04月24日hadoop(十三)-mahout安装与使用【移动开发】2015年01月13日常见排序算法总结【编程语言】2015年02月28日IOS把图片缓存到本地的几种方法 【编程语言】2015年07月16日hdu3682ToBeanDreamArchitect 【编程语言】2014年11月04日PHP获取指定日期所在月的第一天和最后一天几个例子2014年11月04日DFSHDU1342 【综合】2014年11月18日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)