隨筆-1  評論-68  文章-98  trackbacks-0
          作者:徐建祥(netpirate@gmail.com)
          日期:2009/11/05
          網(wǎng)址:http://www.anymobile.org



          1.1 通過com.android.settings.WirelessSettings打開飛行模式;

          1.1.1 設(shè)置飛行模式值;
          Settings.System.putInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, enabling ? 1 : 0);

          1.1.2 發(fā)出Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED)。
          AirplaneModeEnabler.setAirplaneModeOn(boolean enabling)

          1.2 關(guān)閉相關(guān)的服務(wù)連接

          1.2.1 關(guān)閉WIFI;
          frameworks/base/services/java/com/android/server/WifiService.BroadcastReceiver.onReceive(...)

          1.2.2 關(guān)閉Bluetooth;
          frameworks/base/core/java/android/server/BluetoothDeviceService.BroadcastReceiver.onReceive(...)

          1.2.3 關(guān)閉RADIO。
          PhoneApp.PhoneAppBroadcastReceiver.onReceive(...) -> GSMPhone.setRadioPower(false)->ServiceStateTracker.setRadioPower(false)->ServiceStateTracker.setPowerStateToDesired()->RIL.setRadioPower(true, null)

          2/ 取消飛行模式

          與打開飛行模式流程類似,false改為true,略。

          3/ 飛行模式啟動流程

          在SIM_READY后,ServiceStateTracker收到RADIO_STATE_CHANGED通知后,關(guān)閉RADIO;WIFI和藍(lán)牙部分,則會在對應(yīng)的服務(wù)程序中判斷飛行模式設(shè)置,如果是飛行模式,則不可用。

          下面是RADIO OFF流程:

          3.1 正常開機,在RADIO STATE切換到SIM_READY狀態(tài)后,向上發(fā)出EVENT_RADIO_STATE_CHANGED通知;
          RADIO.STATE = RADIO_STATE_UNAVAILABLE->RADIO_STATE_OFF->SIM_NOT_READY->SIM_READY
          (hardware/ril/reference-ril/reference-ril.c)

          3.2 ServiceStateTracker.java初始化,設(shè)置mDesiredPowerState = ! (airplaneMode > 0),并調(diào)用RIL接口注冊EVENT_RADIO_STATE_CHANGED;
          frameworks/base/telephony/java/com/android/internal/telephony/gsm/ServiceStateTracker.java

          3.3 ServiceStateTracker.java處理RADIO STATE的變化,如果不是飛行模式,設(shè)置RADIO狀態(tài)為ON;如果是飛行模式,且開機狀態(tài),則關(guān)掉RADIO;
           1     public void handleMessage (Message msg)
           2             case EVENT_RADIO_STATE_CHANGED:
           3                 // This will do nothing in the radio not
           4                 // available case
           5                 setPowerStateToDesired();
           6                 pollState();
           7                 break;
           8     private void setPowerStateToDesired()
           9         if (mDesiredPowerState
          10             && cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF
          11         ) {
          12             cm.setRadioPower(truenull);
          13         } else if (!mDesiredPowerState && cm.getRadioState().isOn()) {
          14             dcTracker.cleanConnectionBeforeRadioOff();
          15             // If it's on and available and we want it off..
          16             cm.setRadioPower(falsenull);
          17         } // Otherwise, we're in the desired state
          18     }

          3.4 RADIO關(guān)掉后(狀態(tài)變?yōu)镽ADIO_OFF),再向上發(fā)一個EVENT_RADIO_STATE_CHANGED通知,參考3.3。
          posted on 2009-11-05 19:46 Xu Jianxiang 閱讀(4419) 評論(3)  編輯  收藏 所屬分類: Android

          評論:
          # re: Android 1.5: 飛行模式分析 2011-07-13 16:48 | DK
          這個帖子寫得太麻煩,大家可以看看這個帖子
          http://bbs.gfan.com/android-1996857-1-1.html  回復(fù)  更多評論
            
          # re: Android 1.5: 飛行模式分析[未登錄] 2011-08-10 14:18 | Xu Jianxiang
          @DK
          一個是系統(tǒng)級的修改,一個是應(yīng)用級的,呵呵!  回復(fù)  更多評論
            
          # re: Android 1.5: 飛行模式分析[未登錄] 2011-12-19 18:55 | jet
          @DK
          不是一個檔次!此帖旨在分析整個飛行模式的調(diào)用邏輯。  回復(fù)  更多評論
            
          主站蜘蛛池模板: 长汀县| 合阳县| 化隆| 安丘市| 冀州市| 井陉县| 江北区| 丁青县| 鹿邑县| 原阳县| 郴州市| 饶平县| 色达县| 石渠县| 隆尧县| 阿拉善左旗| 通渭县| 承德县| 阜平县| 哈尔滨市| 神池县| 乡宁县| 区。| 陕西省| 奉新县| 兰坪| 延庆县| 文山县| 漠河县| 隆德县| 淳安县| 青龙| 平阴县| 理塘县| 左云县| 襄汾县| 遂昌县| 将乐县| 苍溪县| 宜州市| 长宁县|