GSMPhone與CDMAPhone切換過程


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與當前注冊網絡技術,進行比較,不匹配通知上層,進行查詢更新。


免責聲明!

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



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