第1章 偏好网络设置
在了解偏好网络设置之前,先复习一下几个网络相关内容:
OSI七层协议中网络由下向上分为:物理层、数据链路层、网络接口层、运输层、会话层、表示层、应用层;
http:超文本传输协议;https:是以安全为目标的HTTP通道;
socket是对TCP/IP协议的封装和应用,TCP/IP协议是运输层协议,主要解决数据如何在网络中传输,而http协议是应用层协议主要解决如何包装数据。
1.1 相关文件
/frameworks/base/core/res/res/values/config.xml
在config.xml文件里面有各种不同类型的网络配置,<item>中对应的内容分别是:name,type,radio,priority,restoreTime,dependencyMet。
图1 config.xml文件中不同网络配置网络
1.1.1 ConnectivityService服务
frameworks/base/services/core/java/com/android/server/ConnectivityService.java
在上面的内容中,我们看到在配置文件中设置了不同网络类型的优先级,ConnectivityService的构造函数中会调用上面配置文件中的内容。
图2 调用xml文件中的内容并加以处理
首先会获取config.xml中的字符保存在String数组naString中,然后循环处理数组中的每个元素,如(wifi,1,1,1,-1,true)。每个元素中的各项跟类NetworkConfig的成员变量对应,这里的处理主要是在声明一个NetworkConfig对象时把每个String元素作为参数,最后把每个NetworkConfig对象加到数组mNetConfigs中。至此,有关各种网络的配置都保存在数组mNetConfigs里面。
rematchNetworkAndRequests函数会获取当前网络的分数和oldScore进行比较,当当前网络分数比较高的时候就会连接当前网络。
1.2 偏好网络设置
图1 总体流程图
1.2.1 MobileNetworkSettings
从log中可以看出,最开始执行的是MobileNetworkSettings的onCreate(),然后执行initializeSubscriptions,updateBody。
图2 log信息
onCreate():做一些初始化的工作;
initializeSubscriptions():确定两张卡的Tab title和界面显示;
updateBody()---》updateBodyAdvancedFields():确定每个Preference显示的内容,判断逻辑如下:
1)updateBodyAdvancedFields:
通过CarrierConfigManager.KEY_WORLD_PHONE_BOOL的值来确定我们点击Preferred network type选项后显示的选项界面。
设置监听事件,监听网络模式改变,触发onPreferenceChange();
通过判断当前应该显示的preference以及设置的网络类型和当前网络类型是否一样,如果不一样就往下选择网络类型。setOnPreferenceChangeListerner监听偏好网络;
图3 updateBodyAdvancedFields网络类型选择
调用UpdatePreferredNetworkModeSummary(),这个函数的主要作用是根据你选择的entryValue值设置mButtonPreferredNetworkMode里要显示的内容
图4
1.1)onPreferenceChange:在这个函数里面会判断用户通过按钮选择的网络模式与设置的首选模式是否一样,若不同则会调用setPreferredNetworkType更改成用户界面所选择的模式。
根据 subId 从数据库里获取 NetworkMode值,点击mBtttonPreferredNetworkMode,弹出弹框,当你选择其中一个entry,它对应的entryValue会被存储到数据库,当下一次再次点击mButtonPreferredNetworkMode时,首先从数据库获取到这个entryValue,然后再拿它和你选择的entry所对应的entryValue作比较,如果不相等就会再次 将你选择的那个value值存到数据库当你搜网的时候也会用到这个值(偏好网络设置)比如如果你首选3GOnly ,搜网列表里便会只有3G网络
…….
图5更改网络模式,获取 MESSAGE_SET_PREFERRED_NETWORK_TYPE消息
1.2)setPreferredNetworkType:向RIL层发送请求
图6发送请求,并更改网络模式
在这里我们看到调用到了sendRequest(),这是对底层的交互。
2)接着我们看一下MESSAGE_SET_PREFERRED_NETWORK_TYPE消息的处理:
handleMessage —》 handleSetPreferredNetworkTypeResponse 如果有异常的话会调用updatePreferredNetworkUIFromDb(),一切正常的话就是返回success