目录
AcitivityManagerService部分
前期概要
此流程分析是在不同平台可能不一致,只能作为参考文档,是属于一个通用流程文档。
源码分析
入口
首先是界面,我在此平台的界面如下:
编辑
对应的入口源码位置在Settings的ApnSettings中
然后点击切换按钮会调用到UniEnabledNetworkModePreferenceController的onPreferenceChange方法
然后我们分析APN的主要流程:重置APN流程、切换APN、新建APN、编辑APN
重置APN流程
点击右上角的三个点,然后出现如下界面,点击Reset to default就是进行apn重置
编辑
主要流程如下:
1、在ApnSettings界面点击重置后,通过Uri: “content://telephony/carriers/restore"进行delete操作,删除完成后会重新fillList。
2、进行delete操作时,TelephonyProvider通过URL_RESTOREAPN进行删除操作,会删除carriers表,同时删除首选APN,获取preferred-full-apn的SP,如果SP包含version1,表示apn已经存储起来了,删除该subId对应的version1字段以及APN唯一字段与subId组合在一起的字段,删除完成,重新初始化加载carrier表,
3、在ApnSettings界面查询到APN后,会通过Uri:"content://telephony/carriers/
preferapn" 去设置首选APN。
4、初始化完成后,DcTracker监听到数据库变化执行onApnChanged,然后会设置偏好APN
重置源码入口如下,在ApnSettings类中
编辑
编辑
编辑
此处就是调用数据库的delete操作,其中操作的uri就是"content://telephony/carriers/restore",然后会到TelephonyProvider中进行数据删除,如下:
编辑
可以看到上面的代码最终会调用到如下代码
mRestoreApnUiHandler
.sendEmptyMessage(EVENT_RESTORE_DEFAULTAPN_COMPLETE);
此代码就是查询当前的状态并更新界面
编辑
此处是重置过后的一些界面及状态的操作,其中fillList()中是调用了再次查询设置首选项apn的操作,然后进行界面刷新
然后下面就是在DcTracker中监听变化重新设置APN首选项
编辑
切换APN
- 在ApnSettings界面点击onPreferenceChange,执行setSelectedApnKey,设置首选APN
通过URI:content://telephony/carriers/preferapn 和APN_ID为选中的id进行update。 - TelephonyProvider:获取subId,检查values中是否包含apn_id,如果包含apn_id,获取apn_id带过来的id值,将对应的apn_id保存为该subId的首选APN
- DcTracker:监听到数据库变化,ApnChangeObserver的onChange函数将被调用,触发onApnChange函数,onApnChange的时候,底层会清除掉所有的连接。
首先是在ApnSettings.java文件的如下代码中监听切换apn选项的
编辑
编辑
如上uri就是"content://telephony/carriers/preferapn"进行包装的,此处就是进行update操作
然后会走到TelephonyProvider类中检查values中是否包含apn_id,如果包含apn_id,获取apn_id带过来的id值,将对应的apn_id保存为该subId的首选APN,如下:
编辑
最后是在DcTracker监听数据库数据变化,同上面的重置apn差不多,这里不展开说了
新建APN
1、ApnEditor:布局初始化,获取相关控件,获取subId等intent传过来的参数,插入一条仅有id的信息,并根据插入信息返回uri,根据uri查询相应id的数据。
2、根据查询到的数据fillUi进行显示,如果是新建的,mvnoType显示有差异,mvnoMatchData显示有差异
3、移动定制版本,APN协议和APN漫游协议默认为IpV4V6、设置SIM卡相关的监听、APN变化的TextWatcher
4、在onResume中会注册phone状态、插拔卡等的监听
5、(1)点击保存:内置的APN则弹框提示是否保存,非内置的APN,直接验证并保存,如果APN相关有用信息为空,则toast提示,不保存返回,根据各项字段,通过uri更新数据库中数据。
上面的流程基本都在ApnEditor,可以查看ApnEditor这个界面的代码
编辑
编辑APN
1、ApnEditor:布局初始化,获取相关控件,获取subId等intent传过来的参数,插入一条仅有id的信息,并根据插入信息返回uri,根据uri查询相应id的数据。
2、根据查询到的数据fillUi进行显示,如果是新建的,mvnoType显示有差异,mvnoMatchData显示有差异
3、移动定制版本,APN协议和APN漫游协议默认为IpV4V6、设置SIM卡相关的监听、APN变化的TextWatcher
4、在onResume中会注册phone状态、插拔卡等的监听
5、(1)点击保存:内置的APN则弹框提示是否保存,非内置的APN,直接验证并保存,如果APN相关有用信息为空,则toast提示,不保存返回,根据各项字段,通过uri更新数据库中数据。
编辑的过程也基本都在ApnEditor中,可以查看这部分源码
**后续流程**
DcTracker部分
该类检测到APN数据发生改变,执行下图系列方法去获取数据中的数据并保存到ApnSetting类中。
编辑
编辑
编辑
编辑
在数据网络建立成功之后,将代理信息发送给ConnectivityService类。
编辑
编辑
编辑
**ConnectivityService部分**
CS服务接受到消息之后,开始更新路由表、MTU、DNS等信息,最后发送广播给AMS去处理每个进程的Proxy。
编辑
编辑
编辑
**AcitivityManagerService部分**
AMS服务去设置每个进程的代理,然后更新系统属性http.proxyHost
编辑
编辑
至此,该proxy从Settings UI输入开始,到Telephony数据库,然后DcTracker监听到数据库的变化,获取到proxy,发送消息给ConnectivityService服务,在该服务验证了代理是否可用之后,再发送广播给ActivityManagerService去更新每个进程的代理并设置系统属性的值。