[Android]RIL的启动流程

本文详细介绍了RIL模块加载后如何通过上报状态改变来触发飞行模式的切换过程。涉及RIL模块、GsmServiceStateTracker组件及关键函数的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 
RIL模块加载后,会主动上报:
[UNSL]< UNSOL_RESPONSE_RADIO_STATE_CHANGED  {RADIO_OFF}
Ril.java收到这个主动上报后会调用setRadioStateFromRILInt, setRadioStateFromRILInt 将通过setRadioState上报给GsmServiceStateTracker
GsmServiceStateTracker 在初始化时注册EVENT_RADIO_STATE_CHANGED用来监听Radio的状态变化。收到EVENT_RADIO_STATE_CHANGED后,调用setPowerStateToDesired再通知RIJD是否打开radio。setPowerStateToDesired中通过mDesiredPowerState 判定是否打开radio。mDesiredPowerState 的值将在GsmServiceStateTracker 初始化时获取。
可以在GsmServiceStateTracker 获取mDesiredPowerState 之前就把当前的模式设置为飞行模式。
 
下面是这个流程的相关函数。
 
RIL.java
private void setRadioStateFromRILInt(int state) {
        RadioState newState;
        setRadioState(newState);
      }
 
GsmServiceStateTracker
cm.registerForRadioStateChanged(this, EVENT_RADIO_STATE_CHANGED, null);
            case EVENT_RADIO_STATE_CHANGED:
                // This will do nothing in the radio not
                // available case
                Log.d("GSM","handleMessage:EVENT_RADIO_STATE_CHANGED");
                setPowerStateToDesired();
                pollState();
 
     int airplaneMode = Settings.System.getInt(
                phone.getContext().getContentResolver(),
                Settings.System.AIRPLANE_MODE_ON, 0);
        mDesiredPowerState = ! (airplaneMode > 0);//获取是否为飞行模式
          
    protected void setPowerStateToDesired() {
           if (mDesiredPowerState
            && cm.getRadioState() == CommandsInterface.RadioState.RADIO_OFF) {
            Log.d(LOG_TAG,"power on radio");
            cm.setRadioPower(true, null);//通知RILD是否开radio
        }     
    }
        
 
BaseCommands
    public void registerForRadioStateChanged(Handler h, int what, Object obj) {
        Registrant r = new Registrant (h, what, obj);
        synchronized (mStateMonitor) {
            mRadioStateChangedRegistrants.add(r);
            r.notifyRegistrant();
        }
    }
 
    protected void setRadioState(RadioState newState) {
        RadioState oldState;
        synchronized (mStateMonitor) {
            if (Config.LOGV) {
                Log.v(LOG_TAG, "setRadioState old: " + mState
                    + " new " + newState);
            }
            oldState = mState;
            mState = newState;
            if (oldState == mState) {
                // no state transition
                return;
            }
            mRadioStateChangedRegistrants.notifyRegistrants();//通知GsmServiceStateTracker
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值