Calvin's Tech Space

          成于堅忍,毀于浮躁

             :: 首頁 :: 聯系 :: 聚合  :: 管理

          GsmDataConnectionTracker在實例化時,會注冊一個觀察者,監視apn數據庫的變化。
          p.getContext().getContentResolver().registerContentObserver(
                          Telephony.Carriers.CONTENT_URI, true, apnObserver);
                         
          當改變apn后,Settings應用更新apn數據庫,ApnChangeObserver的onChange被調用,發送EVENT_APN_CHANGED消息:
          sendMessage(obtainMessage(EVENT_APN_CHANGED));

          接著onApnChanged()@GsmDataConnectionTracker.java被調用
                -trySetupData(Phone.REASON_APN_CHANGED)@GsmDataConnectionTracker.java
                  --setupData(String reason)@GsmDataConnectionTracker.java
                 
                  private boolean setupData(String reason) {
                  ApnSetting apn;
                  GsmDataConnection pdp;

                  apn = getNextApn();
                  if (apn == null) return false;
                 
                  //獲取一個狀態為inactive的pdp連接對象
                  pdp = findFreePdp();
                  if (pdp == null) {
                      if (DBG) log("setupData: No free GsmDataConnection found!");
                      return false;
                  }
                  mActiveApn = apn;
                  mActivePdp = pdp;

                  Message msg = obtainMessage();
                  msg.what = EVENT_DATA_SETUP_COMPLETE;
                  msg.obj = reason;
                 
                  //開始激活這個pdp
                  //在android2.0.1版本時,有一個PdpConnection.java來進行連接,2.2時這個類被刪掉了,connect的功能合并到GsmDataConnection里面
                  pdp.connect(msg, apn);
                 
                  //設置這個pdp連接狀態為INITING
                  setState(State.INITING);
                  if (DBG) log("setupData for reason: "+reason);
                 
                  //通知上層應用數據連接狀態改變
                  phone.notifyDataConnection(reason);
                  return true;
              }
             
              其中,在這一層,數據連接共七個狀態:
                  IDLE,
                  INITING,
                  CONNECTING,
                  SCANNING,
                  CONNECTED,
                  DISCONNECTING,
                  FAILED
                 
                  對上層應用來說,這七個狀態劃分為四種狀態(getDataConnectionState()@GSMPhone.java):
                  CONNECTED, CONNECTING, DISCONNECTED, SUSPENDED;
                  分別對應TelephonyManager的四種連接狀態。
                 
                  開始激活PDP連接時,設置狀態為State.INITING,調用phone.notifyDataConnection(reason)發出通知,后續調用過程為:
                  notifyDataConnection(String reason)@PhoneBase.java
                    --notifyDataConnection(Phone sender, String reason)@DefaultPhoneNotifier.java
                      .
                      .   這里需要經過IPC調用
                      .
                      notifyDataConnection()@TelephonyRegistry.java
                        --onDataConnectionStateChanged()
                       
          當連接成功后,onDataSetupComplete()@GsmDataConnectionTracker.java被調用
          通過phone.notifyDataConnection(reason);回調應用層的onDataConnectionStateChanged()方法。

          ps:可以通過adb logcat -b radio查看激活數據連接時,radio層的log輸出。
          posted on 2010-11-23 14:12 calvin 閱讀(1839) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 远安县| 安宁市| 保定市| 三亚市| 桂阳县| 临夏县| 蓬莱市| 札达县| 牙克石市| 平乐县| 大城县| 浦城县| 仁寿县| 边坝县| 甘肃省| 博白县| 湘西| 沁阳市| 马尔康县| 江安县| 灌阳县| 化州市| 宝应县| 游戏| 阳曲县| 克拉玛依市| 绩溪县| 泾源县| 陆丰市| 兴安盟| 富顺县| 涟水县| 靖边县| 镇平县| 湾仔区| 正镶白旗| 西峡县| 东乡县| 长宁县| 新竹县| 柞水县|