第6章 雙卡加載流程學習
1、 PhoneFactory中的makeDefaultPhone方法。
單卡還是雙卡:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLuVzVZBHaYF2c5YkY2gnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxQzM4AzNzATM3IDNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
圖6.1
TelephonyNetWorkFactory是建立網絡代理的工廠;
圖6.2
初始化網絡模式和RIL,支援幾張卡就初始化幾個RIL。
圖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對應的無線能力,即設定每張卡使用的協定棧。