ServiceStateTracker网络更新流程

  • ServiceStateTracker.java:主要处理一些与网络相关的状态和数据,它通过注册监听RIL层来获取网络状态的变化,注册监听UiccController 来获取SIM卡的变化情况及SIM卡数据,之后通知其他类网络状态的变更情况。(网络注册状态、漫游、运营商名称、信号强度、时区更新、小区位置CellLocation,网络状态ServiceState,信号强度SignalStrength,
    业务限制状态RestrictedState)
  • NetworkRegistrationManager.java:
  • NetworkRegistrationInfo:

流程:初始化时注册监听RIL网络状态变化,收到变化通知时,查询Modem侧的最新网络信息,对网络状态数据进行解析和保存,并向系统通知发生变化的网络状态信息

  • 对于发生变化的网络信息,SST通知DefaultPhoneNotifier ,通过TelephonyRegistry 通知所有监听者。
  • 应用程序通过注册监听就可以获得最新网络状态信息

ServiceStateTracker向外更新和发布的方式:

  1. SST通知DefaultPhoneNotifier ,通过TelephonyRegistry 通知所有监听者
  2. 通过广播,如注册网络名称
  3. 更新保存状态的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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值