飞行模式的关键流程
点击了飞行模式以后首先会调到Phone.setRadioPower
/frameworks/opt/telephony/src/java/com/android/internal/telephony/GsmCdmaPhone.java
public void setRadioPower(boolean power) {
mSST.setRadioPower(power);
}
然后就调用到了ServiceStateTracker文件里
rameworks/opt/telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java
public void setRadioPower(boolean power) {
mDesiredPowerState = power;
setPowerStateToDesired();
}
protected void setPowerStateToDesired() {
if (DBG) {
String tmpLog = "mDeviceShuttingDown=" + mDeviceShuttingDown +
", mDesiredPowerState=" + mDesiredPowerState +
", getRadioState=" + mCi.getRadioState() +
", mPowerOffDelayNeed=" + mPowerOffDelayNeed +
", mAlarmSwitch=" + mAlarmSwitch +
", mRadioDisabledByCarrier=" + mRadioDisabledByCarrier;
log(tmpLog);
mRadioPowerLog.log(tmpLog);
}
if (mPhone.isPhoneTypeGsm() && mAlarmSwitch) {
if(DBG) log("mAlarmSwitch == true");
Context context = mPhone.getContext();
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.cancel(mRadioOffIntent);
mAlarmSwitch = false;
}
// If we want it on and it's off, turn it on
if (mDesiredPowerState && !mRadioDisabledByCarrier
&& mCi.getRadioState() ==CommandsInterface.RadioState.RADIO_OFF) {
mCi.setRadioPower(true, null);
} else if ((!mDesiredPowerState || mRadioDisabledByCarrier) && mCi.getRadioState().isOn()) {
// If it's on and available and we want it off gracefully
if (mPhone.isPhoneTypeGsm() && mPowerOffDelayNeed) {
if (mImsRegistrationOnOff && !mAlarmSwitch) {
if(DBG) log("mImsRegistrationOnOff == true");
Context context = mPhone.getContext();
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ACTION_RADIO_OFF);
mRadioOffIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
mAlarmSwitch = true;
if (DBG) log("Alarm setting");
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 3000, mRadioOffIntent);
} else {
DcTracker dcTracker = mPhone.mDcTracker;
powerOffRadioSafely(dcTracker);
}
} else {
DcTracker dcTracker = mPhone.mDcTracker;
powerOffRadioSafely(dcTracker);
}
} else if (mDeviceShuttingDown && mCi.getRadioState().isAvailable()) {
mCi.requestShutdown(null);
}
}
mCi即是RIL对象,所以会调用到RIL.java文件中
1019 public void setRadioPower(boolean on, Message result) {
1020 IRadio radioProxy = getRadioProxy(result);
1021 if (radioProxy != null) {
1022 RILRequest rr = obtainRequest(RIL_REQUEST_RADIO_POWER, result,
1023 mRILDefaultWorkSource);
1025 if (RILJ_LOGD) {
1026 riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)
1027 + " on = " + on);
1028 }
1030 try {
1031 radioProxy.setRadioPower(rr.mSerial, on);
1032 } catch (RemoteException | RuntimeException e) {
1033 handleRadioProxyExceptionForRR(rr, "setRadioPower", e);
1034 }
1035 }
1036 }