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



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

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

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

          1.2 關閉相關的服務連接

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

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

          1.2.3 關閉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通知后,關閉RADIO;WIFI和藍牙部分,則會在對應的服務程序中判斷飛行模式設置,如果是飛行模式,則不可用。

          下面是RADIO OFF流程:

          3.1 正常開機,在RADIO STATE切換到SIM_READY狀態后,向上發出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初始化,設置mDesiredPowerState = ! (airplaneMode > 0),并調用RIL接口注冊EVENT_RADIO_STATE_CHANGED;
          frameworks/base/telephony/java/com/android/internal/telephony/gsm/ServiceStateTracker.java

          3.3 ServiceStateTracker.java處理RADIO STATE的變化,如果不是飛行模式,設置RADIO狀態為ON;如果是飛行模式,且開機狀態,則關掉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關掉后(狀態變為RADIO_OFF),再向上發一個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  回復  更多評論
            
          # re: Android 1.5: 飛行模式分析[未登錄] 2011-08-10 14:18 | Xu Jianxiang
          @DK
          一個是系統級的修改,一個是應用級的,呵呵!  回復  更多評論
            
          # re: Android 1.5: 飛行模式分析[未登錄] 2011-12-19 18:55 | jet
          @DK
          不是一個檔次!此帖旨在分析整個飛行模式的調用邏輯。  回復  更多評論
            
          主站蜘蛛池模板: 天门市| 尉氏县| 镇安县| 柳江县| 新沂市| 天水市| 辰溪县| 景洪市| 吉木乃县| 古交市| 灵山县| 西昌市| 格尔木市| 英超| 都兰县| 宁明县| 无棣县| 桦川县| 奇台县| 华宁县| 南安市| 科技| 江安县| 滦平县| 汕头市| 贡山| 秭归县| 大厂| 永丰县| 富源县| 南和县| 沂水县| 沙雅县| 肥乡县| 姜堰市| 甘南县| 会昌县| 绍兴市| 海安县| 舟山市| 虹口区|