Telephony狀態維護—ServiceStateTracker


一 ServiceStateTracker

  作為Phone重要的Tracker:CallTracker,DataConnectionTracker,ServiceStateTracker

ServiceStateTracker:處理和維護手機各種狀態

                   小區位置CellLocation,網絡狀態ServiceState,信號強度SignalStrength,

                   業務限制狀態RestrictedState,用戶識別卡信息IccRecords……

看一下ServiceStateTracker類結構圖:

            

對於CDMA和GSM兩種網絡通信技術,存在着一些差異,下面看看CDMAServiceStateTracker工作流程。

         CDMAServiceStateTracker是一個Handler,用來處理很多Message,從其處理的Message上就可以了解CDMAServiceStateTracker流程和作用。

 

二 CDMAServiceStateTracker構造

1 CDMAServiceStateTracker構造

public CdmaServiceStateTracker(CDMAPhone phone) { //相關對象初始化
        this.phone = phone; ss = new ServiceState(); newSS = new ServiceState(); cellLoc = new CdmaCellLocation(); mSignalStrength = new SignalStrength(); //CDMA Subscription Source 管理 機卡分離 Or 機卡一體
        mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(phone.getContext(), cm, this, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null); //向RIL注冊相關的事件 //注冊Radio 狀態變化監聽事件
        cm.registerForRadioStateChanged(this, EVENT_RADIO_STATE_CHANGED, null);
//語音業務狀態變化 cm.registerForVoiceNetworkStateChanged(this, EVENT_NETWORK_STATE_CHANGED_CDMA, null);
//時間更新 cm.setOnNITZTime(this, EVENT_NITZ_TIME, null);
//信號強度更新 cm.setOnSignalStrengthUpdate(this, EVENT_SIGNAL_STRENGTH_UPDATE, null);
//漫游列表相關 cm.registerForCdmaPrlChanged(this, EVENT_CDMA_PRL_VERSION_CHANGED, null);
//OTA相關 cm.registerForCdmaOtaProvision(this,EVENT_OTA_PROVISION_STATUS_CHANGE, null);
//獲取CDMA制式 cm.getCDMASubscription(obtainMessage(EVENT_POLL_STATE_CDMA_SUBSCRIPTION)); // System setting property AIRPLANE_MODE_ON is set in Settings. int airplaneMode = Settings.System.getInt(cr, Settings.System.AIRPLANE_MODE_ON, 0); mDesiredPowerState = ! (airplaneMode > 0); }

 

2 事件處理

RIL接收到此類事件就會notify到注冊的Handler中處理;

                   

public void handleMessage (Message msg) { switch (msg.what) { …… case EVENT_RUIM_READY: //解析漫游相關的ERI數據
 phone.prepareEri(); break; case EVENT_NV_READY: //機卡一體subscription information存儲在手機上NV中
 getSubscriptionInfoAndStartPollingThreads(); break; case EVENT_RADIO_STATE_CHANGED: //Radio打開狀態 獲取信號強度
                if(cm.getRadioState() == RadioState.RADIO_ON) { handleCdmaSubscriptionSource(mCdmaSSM.getCdmaSubscriptionSource()); // Signal strength polling stops when radio is off.
 queueNextSignalStrengthPoll(); } //start Radio
 setPowerStateToDesired(); //網絡狀態變化更新
 pollState(); break; case EVENT_NETWORK_STATE_CHANGED_CDMA: //網絡狀態變化更新
 pollState(); break; case EVENT_GET_SIGNAL_STRENGTH: //獲取射頻信號強度
                onSignalStrengthResult(ar, phone, false); queueNextSignalStrengthPoll(); break; case EVENT_POLL_SIGNAL_STRENGTH: cm.getSignalStrength(obtainMessage(EVENT_GET_SIGNAL_STRENGTH)); break; case EVENT_NITZ_TIME: //更新時間
 setTimeFromNITZString(nitzString, nitzReceiveTime); break; case EVENT_SIGNAL_STRENGTH_UPDATE: //更新信號強度
                onSignalStrengthResult(ar, phone, false); break; case EVENT_RUIM_RECORDS_LOADED: //更新手機Spn顯示
 updateSpnDisplay(); break; …… } }

 

3 事件處理流程

                   開機構造Phone時,創建CdmaServiceStateTracker對象並注冊監聽事件.

開機幾個事件處理:

          

  rild進程中建立RIL CPP與QCRIL的連接之后,要保證建立Framework層RIL與Native RIL socket連接

當建立socket連接之后,RIL_CPP會想 RIL_JAVA發送RIL_UNSOL_RIL_CONNECTED消息,告訴RIL_JAVA已經建立連接;

  否則RIL_JAVA不斷嘗試建立連接,RIL_CPP會繼續監聽連接.

根據這個序列圖過程:

  1)  RIL_CPP向RIL_JAVA發送建立連接消息RIL_UNSOL_RIL_CONNECTED

  2) RIL_JAVA收到建立連接的RIL_UNSOL_RIL_CONNECTED后,向RILD發送RIL_REQUEST_RADIO_POWER消息,將RADIO置為 OFF狀態

  3)  MODEM發送RADIO狀態改變的事件,RIL_JAVA收到后,切換狀態並通知RADIO狀態變化

  4)  CdmaServiceStateTracker接收到EVENT_RADIO_STATE_CHANGED通知,會啟動RADIO設置為On狀態

  5)  RIL_JAVA會向RILD發送RIL_REQUEST_RADIO_POWER消息,去啟動RADIO

  6)  RADIO狀態變化,發送EVENT_RADIO_STATE_CHANGED通知,CdmaServiceStateTracker更新狀態,獲取信號強度……

 

4  狀態設置

         在代碼里看到狀態的變化處理都是在pollState中處理的

 

  case EVENT_RADIO_STATE_CHANGED: setPowerStateToDesired(); pollState(); break; case EVENT_NETWORK_STATE_CHANGED_CDMA: pollState(); break;

 

最終狀態的都是通過調用函數pollStateDone完成:

  protected void pollStateDone() { //維護兩個ServiceState狀態,判斷狀態的變化狀況
        if (DBG) log("pollStateDone: oldSS=[" + ss + "] newSS=[" + newSS + "]"); //移動網絡狀況
        boolean hasRegistered = ss.getState() != ServiceState.STATE_IN_SERVICE && newSS.getState() == ServiceState.STATE_IN_SERVICE; boolean hasDeregistered = ss.getState() == ServiceState.STATE_IN_SERVICE && newSS.getState() != ServiceState.STATE_IN_SERVICE; //數據網絡狀況
        boolean hasCdmaDataConnectionAttached = mDataConnectionState != ServiceState.STATE_IN_SERVICE && mNewDataConnectionState == ServiceState.STATE_IN_SERVICE; boolean hasCdmaDataConnectionDetached = mDataConnectionState == ServiceState.STATE_IN_SERVICE && mNewDataConnectionState != ServiceState.STATE_IN_SERVICE; //各種數據連接狀態變化判斷
        boolean hasCdmaDataConnectionChanged = mDataConnectionState != mNewDataConnectionState; boolean hasRadioTechnologyChanged = mRilRadioTechnology != mNewRilRadioTechnology; boolean hasChanged = !newSS.equals(ss); boolean hasRoamingOn = !ss.getRoaming() && newSS.getRoaming(); boolean hasRoamingOff = ss.getRoaming() && !newSS.getRoaming(); boolean hasLocationChanged = !newCellLoc.equals(cellLoc); //更新狀態
 ServiceState tss; tss = ss; ss = newSS; newSS = tss; // clean slate for next time
 newSS.setStateOutOfService(); CdmaCellLocation tcl = cellLoc; cellLoc = newCellLoc; newCellLoc = tcl; mDataConnectionState = mNewDataConnectionState; mRilRadioTechnology = mNewRilRadioTechnology; // this new state has been applied - forget it until we get a new new state
        mNewRilRadioTechnology = 0; newSS.setStateOutOfService(); // clean slate for next time //網絡注冊狀態通知
        if (hasRegistered) { mNetworkAttachedRegistrants.notifyRegistrants(); } //數據連接通知
        if (hasCdmaDataConnectionAttached) { mAttachedRegistrants.notifyRegistrants(); } //數據斷開通知
        if (hasCdmaDataConnectionDetached) { mDetachedRegistrants.notifyRegistrants(); } //開啟漫游通知
        if (hasRoamingOn) { mRoamingOnRegistrants.notifyRegistrants(); } …… }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM