<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Android電話系統之GSMCallTracker 通話連接管理 GSMCallTracker在本質上是一個Handler。 [![wps_clip_image-65](https://box.kancloud.cn/2016-05-05_572b1a2379092.gif "wps_clip_image-65") ](http://hi.csdn.net/attachment/201005/14/0_1273850076CzIU.gif) GSMCallTracker是Android的通話管理層。GSMCallTracker建立了ConnectionList來管理現行的通話連接,并向上層提供電話調用接口。 [![wps_clip_image-1](https://box.kancloud.cn/2016-05-05_572b1a238bd2d.gif "wps_clip_image-1") ](http://hi.csdn.net/attachment/201005/14/0_1273850080TJjj.gif) 在GSMCallTracker中維護著通話列表:connections。順序記錄了正連接上的通話,這些通話包括:ACTIVE,DIALING,ALERTING,HOLDING,INCOMING,WAITING等狀態的連接。GSMCallTracker將這些連接分為了三類別進行管理: RingingCall: INCOMING ,WAITING ForegourndCall: ACTIVE, DIALING ,ALERTING BackgroundCall: HOLDING 上層函數通過getRingCall(),getForegrouandCall()等來獲得電話系統中特定通話連接。 為了管理電話狀態,GSMCallTracker在構造時就將自己登記到了電話狀態變化通知表中。RIL-Java一收到電話狀態變化的通知,就會使用EVENT_CALL_STATE_CHANGE通知到GSMCallTacker 在一般的實現中,我們的通話Call Table是通過AT+CLCC查詢到的,CPI可以通知到電話的改變,但是CPI在各個Modem的實現中差別比較大,所以參考設計都沒有用到CPI這樣的電話連接改變通知,而是使用最為傳統的CLCC查詢CALL TABLE。在GSMTracker中使用connections來管理Android電話系統中的通話連接。每次電話狀態發生變化是GSMTracker就會使用CLCC查詢來更新connections內容,如果內容有發生變化,則向上層發起電話狀態改變的通知。 ### 1 RIL-JAVA中發起電話連接列表操作 在RIL-JAVA中涉及到CurrentCallList查詢的有以下幾個操作: (1)hangup (2)dial (3)acceptCall (4)rejectCall 在GSMcallTracker在發起這些調用的時候都有一個共同的ResultMessage構造函數:obtainCompleteMessage()。obtainCompleteMessage()實際上是調用: obtainCompleteMessage(EVENT_OPERATION_COMPLETE) 這就意味著在這些電話操作后,GSMCallTracker會收到EVENT_OPERATION_COMPLETE消息,于是我們將目光轉移到handleMessage()@GSMCallTracker的EVENT_OPERATION_COMPLETE事件處理:operationComplete@GSMCallTracker。 operationComplete()操作會使用cm.getCurrentCalls(lastRelevantPoll)調用,向RILD發起RIL_REQUEST_GET_CURRENT_CALLS調用,這個最終就是向Modem發起AT+CLCC,獲取到真正的電話列表。 ### 2 在RILD中,引起getCurrentCalls調用 (1)在RILD中,收到URC消息: +CRING RING NO CARRIER +CCWA 將會使用RIL_onUnsolicitedResponse( RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED),主動向ril-java上報RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息。 (2) 在處理requestCurrentCalls時,使用CLCC查詢通話連接(CALL TABLE)后,如何發現有call Table不為空則開啟一個定時器,主動上報RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息,直到沒有電話連接為止。 在RIL-Java層收到RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED這個URC,并利用mCallStateRegistrants.notifyRegistrants(new AsyncResult(null, null, null))來通知電話狀態的變化,此時GSMTracker會接收到EVENT_CALL_STATE_CHANGE消息,并使用 pollCallsWhenSafe()->? cm.getCurrentCalls(lastRelevantPoll); 來發起查詢,并更新JAVA層的電話列表。 ### 3 handlePollCalls電話列表刷新 首先我們來看看是什么引起了handlePollCalls的調用。 上面的1,2分析了,Android電話系統中所有引起電話連接列表更新的條件及其處理。他們共同的調用了cm.getCurrentCalls(lastRelevantPoll) 來完成電話列表的獲取。 lastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT) 我們這里就從可以看到獲取到的電話列表Result使用handlePollCalls進行了處理。Result實際上是一個DriverCall列表,handlePollCalls的工作就是將當前電話列表與RIL-Java的電話列表對比,使用DriverCall列表更新CallTracker的電話列表connections,并向上傳遞電話狀態改變的通知。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看