GsmDataConnectionTracker在實例化時,會注冊一個觀察者,監視apn數據庫的變化。
p.getContext().getContentResolver().registerContentObserver(
Telephony.Carriers.CONTENT_URI, true, apnObserver);
當改變apn后,Settings應用更新apn數據庫,ApnChangeObserver的onChange被調用,發送EVENT_APN_CHANGED消息:
sendMessage(obtainMessage(EVENT_APN_CHANGED));
接著onApnChanged()@GsmDataConnectionTracker.java被調用
-trySetupData(Phone.REASON_APN_CHANGED)@GsmDataConnectionTracker.java
--setupData(String reason)@GsmDataConnectionTracker.java
private boolean setupData(String reason) {
ApnSetting apn;
GsmDataConnection pdp;
apn = getNextApn();
if (apn == null) return false;
//獲取一個狀態為inactive的pdp連接對象
pdp = findFreePdp();
if (pdp == null) {
if (DBG) log("setupData: No free GsmDataConnection found!");
return false;
}
mActiveApn = apn;
mActivePdp = pdp;
Message msg = obtainMessage();
msg.what = EVENT_DATA_SETUP_COMPLETE;
msg.obj = reason;
//開始激活這個pdp
//在android2.0.1版本時,有一個PdpConnection.java來進行連接,2.2時這個類被刪掉了,connect的功能合并到GsmDataConnection里面
pdp.connect(msg, apn);
//設置這個pdp連接狀態為INITING
setState(State.INITING);
if (DBG) log("setupData for reason: "+reason);
//通知上層應用數據連接狀態改變
phone.notifyDataConnection(reason);
return true;
}
其中,在這一層,數據連接共七個狀態:
IDLE,
INITING,
CONNECTING,
SCANNING,
CONNECTED,
DISCONNECTING,
FAILED
對上層應用來說,這七個狀態劃分為四種狀態(getDataConnectionState()@GSMPhone.java):
CONNECTED, CONNECTING, DISCONNECTED, SUSPENDED;
分別對應TelephonyManager的四種連接狀態。
開始激活PDP連接時,設置狀態為State.INITING,調用phone.notifyDataConnection(reason)發出通知,后續調用過程為:
notifyDataConnection(String reason)@PhoneBase.java
--notifyDataConnection(Phone sender, String reason)@DefaultPhoneNotifier.java
.
. 這里需要經過IPC調用
.
notifyDataConnection()@TelephonyRegistry.java
--onDataConnectionStateChanged()
當連接成功后,onDataSetupComplete()@GsmDataConnectionTracker.java被調用
通過phone.notifyDataConnection(reason);回調應用層的onDataConnectionStateChanged()方法。
ps:可以通過adb logcat -b radio查看激活數據連接時,radio層的log輸出。