天天看點

第6章 雙卡加載流程學習

第6章 雙卡加載流程學習

1、 PhoneFactory中的makeDefaultPhone方法。

單卡還是雙卡:

第6章 雙卡加載流程學習

圖6.1

TelephonyNetWorkFactory是建立網絡代理的工廠;

第6章 雙卡加載流程學習

圖6.2

初始化網絡模式和RIL,支援幾張卡就初始化幾個RIL。

第6章 雙卡加載流程學習

圖6.3

接着就是大緻把流程梳理一下、其實這些都是上幾次說過的内容,這次隻不過把他們合并在一起、并稍微添加了一些内容。

1、開機後PhoneFactory建立出了UiccController,該對象将作為RIL的觀察者,監聽卡狀态變化的事件。

2、當PhoneFactory建立出GsmCdmaPhone後,GsmCdmaPhone在其初始化函數中将建立出IccCardProxy對象。

IccCardProxy對象将作為UiccController的觀察者,同樣監聽卡狀态的變化。

3、當使用者進行插卡操作且底層檢卡成功後,modem将主動向RIL發送RIL_UNSOL_SIM_STATUS_CHANGED消息。

此時,RIL将通知它的觀察者UiccController。

4、UiccController收到RIL的通知後,将調用getIccCardStatus函數主動從modem擷取卡相關的資訊。

一旦卡資訊擷取成功,UiccController将調用其onGetIccCardStatusDone函數。

5、在onGetIccCardStatusDone函數中,UiccController将判斷是否建立過卡對應的UiccCard對象。

如果沒有建立過,UiccController将根據卡資訊建立出對應的UiccCard對象;

否則,僅進行UiccCard的更新操作。

6、當UiccCard對象被建立時,在它的構造函數中将進一步建立出對應的UiccCardApplication和IccRecords。

需要注意的是,IccRecords隻是一個抽象類,

UiccCardApplication将根據modem上報的卡類型,建立出實際的子類,

即SIMRecords、RuimRecords等。

當IccRecords被建立後,同樣将作為RIL的觀察者,監聽卡狀态更新消息。

7、UiccController完成上述工作後,将通知其觀察者IccCardProxy對象。

此時,卡資訊還未完全加載完畢。

IccCardProxy收到UiccController的通知後,注冊成為IccRecords的觀察者。

8、收到modem主動上報的RIL_UNSOL_SIM_REFRESH消息後,RIL将通知IccRecords對象。

IccRecords對象收到通知後,将主動與modem通信,進一步擷取卡相關的資訊。

當SIMRecords收到RIL的通知後,将調用handleSimRefresh函數進行處理。

handleSimRefresh函數将負責擷取或更新卡對應的檔案資訊。

fetchSimRecords函數,将向modem發送Request,擷取卡對應的資訊。

9、當卡資訊加載完畢後,IccRecords将調用onAllRecordsLoaded函數,通知它的觀察者。

10、IccCardProxy收到通知後,将調用broadcastInternalIccStateChangedInent函數,

發送ACTION_INTERNAL_SIM_STATE_CHANGED廣播。

該廣播發送後,将觸發資料卡的選擇流程。

1、在前文中我們提到了IccCardProxy在卡資訊加載完畢後,會發送ACTION_INTERNAL_SIM_STATE_CHANGED廣播。

SubscriptionInfoUpdater收到廣播後,就會調用handleSimLoaded函數進行處理。

2、在handleSimLoaded函數中,主要工作将由updateSubscriptionInfoByIccId函數來承擔。

updateSubscriptionInfoByIccId依次調用clearSubInfo和addSubscriptionInfoRecord函數完成實際的工作。

3、clearSubInfo主要用于清除slot Id和sub Id之間的關系。

畢竟在卡槽中重新插入一張卡後,sub Id可能發生了變化,是以需要先清理過去的緩存資訊。

4、addSubscriptionInfoRecord函數調用SubscriptionController的接口進行實際工作。

SubscriptionController首先将更新一些資料庫字段,

設定一些卡界面顯示所需要的資訊,例如SIM卡在設定界面中的名稱、顔色等。

然後,SubscriptionController重建立立起Slot Id和Sub Id之間的映射關系。

最後,SubscriptionController判斷終端中隻有一張卡時,開始設定資料、語音和短信使用的Sub Id等。

資料卡設定完畢後,SubscriptionController将發送相應的廣播資訊。

5、此外,SubscriptionController調用setDefaultDataSubId設定資料卡後,

還需要利用ProxyController的接口設定每個Phone對應的無線能力,即設定每張卡使用的協定棧。