Telephony狀態維護—ServiceStateTracker

來源:互聯網
上載者:User
一 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();        }                    ……    }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.