[Android]RIL的启动流程

 

 
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值