日期: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(true, null);
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(false, null);
17 } // Otherwise, we're in the desired state
18 }
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(true, null);
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(false, null);
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。