- ServiceStateTracker.java:主要处理一些与网络相关的状态和数据,它通过注册监听RIL层来获取网络状态的变化,注册监听UiccController 来获取SIM卡的变化情况及SIM卡数据,之后通知其他类网络状态的变更情况。(网络注册状态、漫游、运营商名称、信号强度、时区更新、小区位置CellLocation,网络状态ServiceState,信号强度SignalStrength,
业务限制状态RestrictedState) - NetworkRegistrationManager.java:
- NetworkRegistrationInfo:
流程:初始化时注册监听RIL网络状态变化,收到变化通知时,查询Modem侧的最新网络信息,对网络状态数据进行解析和保存,并向系统通知发生变化的网络状态信息
- 对于发生变化的网络信息,SST通知DefaultPhoneNotifier ,通过TelephonyRegistry 通知所有监听者。
- 应用程序通过注册监听就可以获得最新网络状态信息
ServiceStateTracker向外更新和发布的方式:
- SST通知DefaultPhoneNotifier ,通过TelephonyRegistry 通知所有监听者
- 通过广播,如注册网络名称
- 更新保存状态的prop,如当前注册网络的mccmnc
ServiceStateTracker:处理和维护手机各种状态
小区位置CellLocation,网络状态ServiceState,信号强度SignalStrength,
业务限制状态RestrictedState,用户识别卡信息IccRecords……
Step 1:注册监听事件
mCi.registerForNetworkStateChanged(this, EVENT_NETWORK_STATE_CHANGED
, null);
处理事件为EVENT_NETWORK_STATE_CHANGED
Step 2:modem主动上报网络状态变化
12-09 15:01:57.691 D/RILJ ( 2674): [UNSL]< UNSOL_RESPONSE_NETWORK_STATE_CHANGED
[SUB0]
12-09 15:01:57.692 D/NRM-C-0 ( 2674): onNetworkStateChanged
Step3:SST 查询operator、voice、data注册状态
GsmServiceStateTracker收到EVENT_NETWORK_STATE_CHANGED就会调用 PollState()
来获取状态
01-25 10:13:56.727 D/RILJ ( 3636): [5596]> OPERATOR [SUB0] 获取运营商
01-25 10:13:56.727 D/RILJ ( 3636): [5597]> DATA_REGISTRATION_STATE [SUB0] 获取PS状态
01-25 10:13:56.727 D/RILJ ( 3636): [5598]> VOICE_REGISTRATION_STATE [SUB0] 获取CS状态
01-25 10:13:56.727 D/RILJ ( 3636): [5599]> QUERY_NETWORK_SELECTION_MODE [SUB0] 获取网络模式
//.rat对应的网络模式 ServiceState.java RIL_RADIO_TECHNOLOGY_LTE = 14;
01-25 10:13:56.737 D/RILJ ( 3636): [5597]< DATA_REGISTRATION_STATE {.regState = REG_HOME, .rat = 14, .reasonDataDenied = 0, .maxDataCalls = 1, .cellIdentity = {…}} [SUB1]
01-25 10:13:56.747 D/RILJ ( 3636): [5596]< OPERATOR {CHN-UNICOM, UNICOM, 46001} [SUB0]
01-25 10:13:56.757 D/RILJ ( 3636): [5598]< VOICE_REGISTRATION_STATE {.regState = REG_HOME, .rat = 14, .cssSupported = false, .roamingIndicator = 0, .systemIsInPrl = 1, .defaultRoamingIndicator = 2, .reasonForDenial = 0, .cellIdentity = {…}} [SUB1]
01-25 10:13:56.757 D/RILJ ( 3636): [5599]< QUERY_NETWORK_SELECTION_MODE {0} [SUB0]
等4个请求都返回了,调用pollStateDone来进行状态的上报,这里有一个mPollingContext,在向底层发请求会递增,底层返回能递减,等于0就认为返回完成。
1. ServiceStateTracker 初始化
frameworks/opt/telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java
662 // 监听卡状态、信号强度、cell小区信息变化
663 mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
664 mCi.setOnSignalStrengthUpdate(this, EVENT_SIGNAL_STRENGTH_UPDATE, null);
665 mCi.registerForCellInfoList(this, EVENT_UNSOL_CELL_INFO_LIST, null);
666 mCi.registerForPhysicalChannelConfiguration(this, EVENT_PHYSICAL_CHANNEL_CONFIG, null);
686 mCi.registerForImsNetworkStateChanged(this, EVENT_IMS_STATE_CHANGED, null);
687 mCi.registerForRadioStateChanged(this, EVENT_RADIO_STATE_CHANGED, null);
688 mCi.setOnNITZTime(this, EVENT_NITZ_TIME, null);
667 // 监听subInfo 变化
668 mSubscriptionController = SubscriptionController.getInstance();
669 mSubscriptionManager = SubscriptionManager.from(phone.getContext());
670 mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
// 监听网络状态变化
674 mTransportManager = mPhone.getTransportManager(); // TransportManager 每个卡槽创建一个对象
676 for (int transportType : mTransportManager.getAvailableTransports()) {
// TRANSPORT_TYPE_WWAN 或TRANSPORT_TYPE_WLAN
// SparseArray<NetworkReg