GSMPhone與CDMAPhone切換過程

來源:互聯網
上載者:User

GSMPhone與CDMAPhone切換過程

 

Phone建立過程

  Phone APP開機啟動,會去建立Phone:

public static void makeDefaultPhone(Context context) {    // Get preferred network mode 根據網路設定,    // 否則預設PREFERRED_NETWORK_MODE 為= NETWORK_MODE_WCDMA_PREF;    int preferredNetworkMode = RILConstants.PREFERRED_NETWORK_MODE;    if (BaseCommands.getLteOnCdmaModeStatic() == Phone.LTE_ON_CDMA_TRUE) {        preferredNetworkMode = Phone.NT_MODE_GLOBAL;    }        //從資料庫中查詢設定preferred network mode    int networkMode = Settings.Secure.getInt(context.getContentResolver(),            Settings.Secure.PREFERRED_NETWORK_MODE, preferredNetworkMode);    //建立RIL,將會設定Modem的preferred network mode  sCommandsInterface = new RIL(context, networkMode, cdmaSubscription);    //若沒有設定preferred network mode 或者設定pref WCDMA 則create GSMPhone         int phoneType = getPhoneType(networkMode);    if (phoneType == Phone.PHONE_TYPE_GSM) {        //create GSMPhone        sProxyPhone = new PhoneProxy(new GSMPhone(context,                sCommandsInterface, sPhoneNotifier));    } else if (phoneType == Phone.PHONE_TYPE_CDMA) {        //create CDMAPhone Or CDMALTEPhone    }        ……}

  Phone是在開機就啟動的,建立具體Phone是GSMPhone還是CDMAPhone,

這個建立過程,跟插入的卡類型無關,跟設定preferred network mode有關;

但是在具體使用中,假如插入UIM卡,顯然是不行,肯定存在著GSMPhone向CDMAPhone切換的過程;或者相反的切換過程,看看此過程是如何進行的。

 

PhoneProxy狀態處理

建立的Phone使用PhoneProxy代理的,PhoneProxy是個handler,實現Phone介面

 

PhoneProxy構造過程

  

public PhoneProxy(PhoneBase phone) {    mActivePhone = phone;    mCommandsInterface = ((PhoneBase)mActivePhone).mCM;                //監聽modem傳遞過來的一些訊息    mCommandsInterface.registerForRilConnected(this, EVENT_RIL_CONNECTED, null);    mCommandsInterface.registerForOn(this, EVENT_RADIO_ON, null);    mCommandsInterface.registerForVoiceRadioTechChanged(                         this, EVENT_VOICE_RADIO_TECH_CHANGED, null);    ……}

 

PhoneProxy裡面監聽了modem傳遞過來的一些,看看這些訊息都具體幹了些什麼。

public void handleMessage(Message msg) {    AsyncResult ar = (AsyncResult) msg.obj;    logd(" msg.what = " + msg.what);    switch(msg.what) {      case EVENT_RADIO_ON:          mVoiceTechQueryContext++;          mCommandsInterface.getVoiceRadioTechnology(              obtainMessage(EVENT_REQUEST_VOICE_RADIO_TECH_DONE,        mVoiceTechQueryContext));          break;      case EVENT_VOICE_RADIO_TECH_CHANGED:          mVoiceTechQueryContext++;          mCommandsInterface.getVoiceRadioTechnology(        obtainMessage(EVENT_REQUEST_VOICE_RADIO_TECH_DONE,        mVoiceTechQueryContext));          break;      case EVENT_REQUEST_VOICE_RADIO_TECH_DONE:              updatePhoneObject(newVoiceTech);              break;        ……    }}

 

  註冊了EVENT_RADIO_ON與EVENT_VOICE_RADIO_TECH_CHANGED
當收到這兩個訊息的時候,都調用了RIL的getVoiceRadioTechnology,擷取當前註冊網路使用技術;

具體是哪一個訊息新建立Phone,通過Log看到是Modem傳遞過來的EVENT_VOICE_RADIO_TECH_CHANGED訊息;
完了之後會將訊息EVENT_REQUEST_VOICE_RADIO_TECH_DONE傳遞給PhoneProxy,
調用updatePhoneObject,更新Phone.

 

GSM 與CDMA切換過程

public void updatePhoneObject(int newVoiceRadioTech) {        //一堆判斷是否當前Phone與當前網路技術相匹配                //當前建立的Phone與網路技術不匹配,重新建立Phone        deleteAndCreatePhone(newVoiceRadioTech);}private void deleteAndCreatePhone(int newVoiceRadioTech) {        String outgoingPhoneName = "Unknown";        Phone oldPhone = mActivePhone;                //列印從GSM——》CDMA Or CDMA——》GSM        outgoingPhoneName = ((PhoneBase) oldPhone).getPhoneName();        logd("Switching Voice Phone : " + outgoingPhoneName + " >>> "              + (ServiceState.isGsm(newVoiceRadioTech) ? "GSM" : "CDMA"));                //oldPhone Unregister              oldPhone.dispose();                      //建立新Phone        createNewPhone(newVoiceRadioTech);}protected void createNewPhone(int newVoiceRadioTech) {    if (ServiceState.isCdma(newVoiceRadioTech)) {        mActivePhone = PhoneFactory.getCdmaPhone();    } else if (ServiceState.isGsm(newVoiceRadioTech)) {        mActivePhone = PhoneFactory.getGsmPhone();    }}

 

通過當前設定Modem的preferred network mode與當前註冊網路技術,進行比較,不匹配通知上層,進行查詢更新。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.