1.DataConnectionTracker.
DataConnectionTracker 就是一個 Handler ,處理與數據連接相關的各種消息,是數據連接的核心類,也就是發起數據連接以及處理數據連接狀態的主體類,主要工作如下:<1>做數據連接的前期準備工作,如檢查apn,DataConnectionAc,等。
<2>初始化DataConnection,DataConnectionAc
<3>通過DataConnectionAc,將數據連接的命令,發送給DataConnection
<4>DataConnection通過自己的狀態機,將網絡狀態進行切換。
<5> 通知NetworkStateTracker,數據連接已經發生變化(連接,斷開,正在連接等狀態)。
主要有GsmDataConnectionTracker 和 CdmaDataConnectionTracker
2.DataConnection
描述具體的數據連接,將數據連接的命令,通過RIL的封裝,發送給RIL層,它是一個狀態機,可以完成網絡狀態切換的工作,主要有GsmDataConnection 等實現類。3.NetworkStateTracker
NetworkStateTracker 接收 DataConnectionTracker通過DefaultPhoneNotifier發出的廣播,如連接成功,連接失敗等。主要有MobileDataStateTracker等實現類,處理相關廣播後,將網絡狀態變化的消息發送給ConnectivityService 去處理。4.ConnectivityService
ConnectivityService 通過接收NetworkTracker 發送的消息,來知道網絡連接的狀況,處理連接,斷開,正在連接,正在斷開等動作。以移動網絡連接爲例。
ConnectivityService 在SystemServer 進程中創建,phone 對象是在Phone進程中創建,SystemServer進程在Phone應用之前創建。GSMPhone 創建 GsmDataConnectionTracker,GsmDataConnectionTracker創建GsmDataConnection.GsmPhone 創建DefaultPhoneNotifier,這個DefaultPhoneNotifier主要將 GsmDataConnectionTracker 的數據連接狀態變化的消息以廣播的消息發送出去。
ConnectionService 創建了MobileDataStateTracker,並且監聽 MobileDataStateTracker的與網絡狀態相關的消息。MobileDataStateTracker 註冊了一個內部Receiver
IntentFilter filter = new IntentFilter();
filter.addAction(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED);
filter.addAction(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED);
filter.addAction(DataConnectionTracker.ACTION_DATA_CONNECTION_TRACKER_MESSENGER);
mContext.registerReceiver(new MobileDataStateReceiver(), filter);
mMobileDataState = Phone.DataState.DISCONNECTED;
ACTION_ANY_DATA_CONNECTION_STATE_CHANGED,當 GsmDataConnectionTracker 檢測到網絡狀態發生變化時,就通過DefaultPhoneNotifier,把這個Action 發送出去,
MobileDataStateTracker將消息處理後,告訴ConnectivityService 現在的網絡狀態。
ACTION_DATA_CONNECTION_FAILED,當GsmDataConnectionTracker 檢測到網絡狀態連接失敗時,就通過DefaultPhoneNotifier,把這個Action 發送出去,
MobileDataStateTracker將消息處理後,告訴ConnectivityService 現在的網絡狀態。
ACTION_DATA_CONNECTION_TRACKER_MESSENGER,當GsmDataConnectionTracker 在GSMPhone 中初始化時,其構造函數,就會發送該Action,MobileDataStateTracker,接收該Action後,新建了一個 AsyncChannel,這個AsynChannel 就是MobileDataStateTracker 和GsmDataConnectionTracker 之間進行數據通信的通道,比如 MobileDataStateTracker的 setUserDataEnable,
public void setUserDataEnable(boolean enabled) {
if (DBG) log("setUserDataEnable: E enabled=" + enabled);
final AsyncChannel channel = mDataConnectionTrackerAc;
if (channel != null) {
channel.sendMessage(CMD_SET_USER_DATA_ENABLE, enabled ? ENABLED : DISABLED);
mUserDataEnabled = enabled;
}
if (VDBG) log("setUserDataEnable: X enabled=" + enabled);
}
channel 就是之前新建的AsyncChannel,將數據連接的任務交給 GsmDataConnectionTracker.
ConnectivityService 接收到 MobileDataStateTracker發送的消息後,就開始處理連接狀態的變化的工作,如handleDisconnected.