1、 PhoneFactory中的makeDefaultPhone方法。
单卡还是双卡:
图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对应的无线能力,即设置每张卡使用的协议栈。