DcTracker对象在Phone对象创建过程中被创建,继承于DcTrackerBase,而DcTackerBase继承于Handler,主要完成以下任务:
1. update():onUpdateIcc更新SIM卡状态;getDataEnabled()获取数据流量开关状态;
2. 初始化各种监听器:registerForAllEvents(),并完成相应事件处理,如PS Attached事件EVENT_DATA_CONNECTION_ATTACHED和网络技术(LTE/GSM/UMTS)监听事件EVENT_DATA_RAT_CHANGED;
3. 初始化一些基本的APN参数:initApnContexts();
图1 DcTacker构造函数源码
APN的创建主要有两种情况触发:①SIM卡载入完毕(onRecordsLoaded());②APN改变(onApnChanged())。上述两个方法均是通过调用createAllApnList()实现APN的创建。
图2 APN创建
framworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection
数据业务的建立有多种原因触发,如漫游、通话结束、APN改变、SIM卡载入完毕和网络模式改变以及PS Attached。本文将就常见的PS Attached进行分析。在DcTacker.java 类中的registerForAllEvents()方法中对PS Attached事件进行注册监听,代码如下:
Protected void registerForAllEvents(){
mPhone.getServiceStateTracker.registerForDataConnectionAttached(this,DctConstants.EVENT_DATA_ATTACHED,null);
}
因此当PS域Attach成功之后,将会收到EVENT_DATA_CONNECTION_ATTACHED消息:
图3 GsmServiceStateTracker注册dataconnection attached事件
图4 EVENT_DATA_ATTACHED消息处理
图5 onDataConnectionAttached方法
onDataConnectionAttached方法调用setupDataOnConnectableApns(),后续步骤详见http://note.youdao.com/share/?id=e37a4204ab15f8be458fad2339aa914c&type=note#/。
整体流程如下:
由于不同事件,DcTracker交互对象不同,所用图中用空模块表示,且不同事件的处理流程也不尽相同,图中仅列出相同部分。而不同事件的DcTracker交互对象如下表所示。
此部分具体代码流程详见http://note.youdao.com/share/?id=71132d434ac52fe9218f8a88ea62e0d5&type=note#/,本文仅以log的形式加以说明。上层Apk打开关闭数据开关的动作具体表现在log如下:
1. main_log: D TelephonyManager: setDataEnabled: enabled=true 关键词:setDataEnabled
2. radio_log:D RILJ : [3995]>RIL_REQUEST_SET_DATA_ON_TO_MD: 1 [SUB0] 关键词:RIL_REQUEST_SET_DATA_ON_TO_MD
D AT : AT> AT+EDSS=1 关键词:EDSS,其中1表示数据开关打开,0表示数据开关turned off