Ims开机注册流程
???????????????????
目錄
- 概述
IMS(IP Multimedia Subsystem)是IP多媒體系統, 是一種新的多媒體業務形式,ims service 結構主要包括 ImsService、ImsManager、MmTelFeatureConnection、ImsCallSession。其中:
- Ims注冊時序圖
??時序圖從開機后PhoneApp啟動開始到最終發出請求
PhoneApp是如何開機啟動的呢,下面我們簡要說明一下。
三、PhoneApp的啟動過程
首先PhoneApp的主要功能是什么呢?
這里我們需要知道,Android系統中多個應用程序(Apk)是可以運行在同一個進程中的,PhoneApp就是這樣,連同Stk、SMSProvider、TelephonyProvider等模塊都運行在com.android.phone進程中(簡稱phone進程)。
??? <application android:name="PhoneApp"android:persistent="true"android:label="@string/phoneAppLabel"android:icon="@mipmap/ic_launcher_phone"android:allowBackup="false"android:supportsRtl="true"android:usesCleartextTraffic="true"android:defaultToDeviceProtectedStorage="true"android:directBootAware="true">
PhoneApp的路徑是:packages\services\Telephony,我們來看看它的AndroidManifest.xml內容:
系統在啟動時會先啟動SystemService,SystemService會啟動各種系統服務,包括AMS:
?而ActivityManagerService的SystemReady方法中就有一個啟動PersistentApps的方法,且該應用還需要MATCH_DIRECT_BOOT_AWARE,而PhoneApp正滿足此需求:
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { ......startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE); ...... }由此可見,PhoneApp會在系統啟動起來的時候由系統自動啟動
四、Ims注冊主要代碼
PhoneApp啟動后會先執行onCreate()方法
packages\services\Telephony\src\com\android\phone\PhoneApp.java
public class PhoneApp extends Application {PhoneGlobals mPhoneGlobals;TelephonyGlobals mTelephonyGlobals;public PhoneApp() {}@Overridepublic void onCreate() {if (UserHandle.myUserId() == 0) {// We are running as the primary user, so should bring up the// global phone state.mPhoneGlobals = new PhoneGlobals(this);// 創建PhoneGlobals,即Phone的全局狀態mPhoneGlobals.onCreate();mTelephonyGlobals = new TelephonyGlobals(this);mTelephonyGlobals.onCreate();}}PhoenApp的onCreate()方法主要創建了mPhoneGlobals對象和mTelephonyGlobals對象,并執行了兩個對象的onCreate()方法,接下來的流程也將圍繞mPhoneGlobals對象的onCreate展開:
packages\services\Telephony\src\com\android\phone\PhoneGlobals.java
首先通過PhoneFactory makeDefaultPhones,下面看一下makeDefaultPhones方法主要執行的動作
frameworks\opt\telephony\src\java\com\android\internal\telephony\PhoneFactory.java
主要貼了創建GSMPhone和CDMAPhone的方法。
總結一下makeDefaultPhone()方法:
Android中有三種PhoneFactory:
1.PhoneFactory.java ——–>用于創建GsmCdmaPhone對象
2.ImsPhoneFactory.java ——–>用于創建ImsPhone對象
3.SipPhoneFactory.java ——–>用于創建SipPhone對象
下面跟進startMonitoringImsService方法
frameworks\opt\telephony\src\java\com\android\internal\telephony\Phone.java
public void startMonitoringImsService() {if (getPhoneType() == PhoneConstants.PHONE_TYPE_SIP) {return;}synchronized(Phone.lockForRadioTechnologyChange) {IntentFilter filter = new IntentFilter();ImsManager imsManager = ImsManager.getInstance(mContext, getPhoneId());// Don't listen to deprecated intents using the new dynamic binding.if (imsManager != null && !imsManager.isDynamicBinding()) {filter.addAction(ImsManager.ACTION_IMS_SERVICE_UP);filter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN);}mContext.registerReceiver(mImsIntentReceiver, filter);if (imsManager != null) {if (imsManager.isDynamicBinding() || imsManager.isServiceAvailable()) {mImsServiceReady = true;updateImsPhone();}}} }從上面的代碼中可以看到,startMonitoringImsService() 做了如下動作:
當接收到UP廣播后
private BroadcastReceiver mImsIntentReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) { ......synchronized (Phone.lockForRadioTechnologyChange) {if (intent.getAction().equals(ImsManager.ACTION_IMS_SERVICE_UP)) {mImsServiceReady = true;updateImsPhone();ImsManager.getInstance(mContext, mPhoneId).updateImsServiceConfig(false);} else if (intent.getAction().equals(ImsManager.ACTION_IMS_SERVICE_DOWN)) {mImsServiceReady = false;updateImsPhone();}} }通過ImsManager更新ImsService的配置
frameworks\opt\net\ims\src\java\com\android\ims\ImsManager.java
此處turnOnIms()會經過TelephonyManager、ImsResolver、ImsServiceController等類的實現、重寫等。最終在高通私有類ImsService中實現。
下面是高通私有類的流程
vendor\qcom\proprietary\commonsys\telephony-apps\ims\src\org\codeaurora\ims\ ImsService.java
????@Overridepublic void enableIms(int slotId) {Log.i(this, "enableIms :: slotId=" + slotId);if (slotId > INVALID_SLOT_ID && slotId < getNumSlots()) {mServiceSubs[slotId].turnOnIms();} else {Log.e(this, "enableIms :: Invalid slotId " + slotId);}}vendor\qcom\proprietary\commonsys\telephony-apps\ims\src\org\codeaurora\ims\ ImsServiceSub.java
????public void turnOnIms() {mCi.sendImsRegistrationState(ImsRegistrationInfo.REGISTERED,mHandler.obtainMessage(EVENT_SET_IMS_STATE));}vendor\qcom\proprietary\commonsys\telephony-apps\ims\src\org\codeaurora\ims\ ImsSenderRxr.java
???public void sendImsRegistrationState(int imsRegState, Message result) {……queueRequest(rr);try {……?????????imsRadioV10().requestRegistrationChange(rr.mSerial,ImsRadioUtils.regStateToHal(imsRegState));} catch (Exception ex) {removeFromQueueAndSendResponse(rr.mSerial);Log.e(this, msgIdString + "request to IImsRadio: Exception: " + ex);}}最后通過ImsSenderRxr把請求發出去。
上述就是ims從開機到注冊的主要流程,關于時序圖中的ImsPhone那塊,就不在詳細說明了。
五、總結
Ims的概念很大,上述只是介紹了它很小的一部分。IMS是一個在分組域(PS)上的多媒體控制/呼叫控制平臺,IMS使得PS具有電路域(CS)的部分功能,支持會話類和非會話類的多媒體業務。IMS為未來的多媒體應用提供了一個通用的業務平臺。
總結
- 上一篇: 输入12V-48V输出5V-12V电流:
- 下一篇: 计算机课程设计家庭,家庭无线局域网组建-