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
          主站蜘蛛池模板: 汕尾市| 营口市| 城固县| 屏东市| 呼玛县| 石景山区| 汉阴县| 建阳市| 宜城市| 吐鲁番市| 天全县| 临泉县| 化隆| 沿河| 平遥县| 满洲里市| 安庆市| 准格尔旗| 闸北区| 翁牛特旗| 滦南县| 金寨县| 金坛市| 石河子市| 乾安县| 凉城县| 嘉义县| 上蔡县| 阜南县| 米林县| 渑池县| 大名县| 五河县| 葵青区| 新邵县| 定安县| 手机| 兰西县| 莆田市| 靖宇县| 襄城县|