android_framework日记3-MT流程底层消息机制分析

Framework层分析:
RIL.java
class RILReceiver implements Runnable 
	run(){
        RILReceiver() {
		processResponse(p);
	}
	}
}
private void
    processResponse (Parcel p) {
        int type;

        type = p.readInt();

        if (type == RESPONSE_UNSOLICITED) {
            processUnsolicited (p);
        } else if (type == RESPONSE_SOLICITED) {
            RILRequest rr = processSolicited (p);
            if (rr != null) {
                rr.release();
                decrementWakeLock();
            }
        }
    }

private void
 processUnsolicited (Parcel p) {
 switch(response) {
 case RIL_UNSOL_CALL_RING:
 if (RILJ_LOGD) unsljLogRet(response, ret);
 if (mRingRegistrant != null) {
 mRingRegistrant.notifyRegistrant(
 new AsyncResult (null, ret, null));
 }
 break;
 }
}


mRingRegistrant对象的创建时间:
BaseCommond.java
@Override
 public void setOnCallRing(Handler h, int what, Object obj) {
 mRingRegistrant = new Registrant (h, what, obj);
 }
然后分析何处调用了 setOnCallRing方法。
PhoneBase.java
  protected PhoneBase(String name, PhoneNotifier notifier, Context context, CommandsInterface ci,
            boolean unitTestMode, int phoneId) 构造方法中构建的
        mCi.setOnCallRing(this, EVENT_CALL_RING, null);


notifyRegistrant将注册信息发出去后,又是什么地方接受并处理的呢?
我们分析 notifyRegistrant实际上最后调用的就是sendMessage()方法,即Message的处理
那我们在本类PhoneBase.java中找handlerMessage()方法,看看有没有处理 EVENT_CALL_RING消息。
 switch(msg.what) {
            case EVENT_CALL_RING:
                Rlog.d(LOG_TAG, "Event EVENT_CALL_RING Received state=" + getState());
                ar = (AsyncResult)msg.obj;
                if (ar.exception == null) {
                    PhoneConstants.State state = getState();
                    if ((!mDoesRilSendMultipleCallRing) 		//判断是否多个电话CallRing
                           //否 
		&& ((state == PhoneConstants.State.RINGING) ||
                                    (state == PhoneConstants.State.IDLE))) {
                        mCallRingContinueToken += 1;
                        sendIncomingCallRingNotification(mCallRingContinueToken);
                    } else {	//是
                        notifyIncomingRing();
                    }
                }
                break;
}
我们找到了 EVENT_CALL_RING消息的处理事件,继续我们的来电处理流程。
------------------------------------------------------------------------------------------------------------------------------------------
sendIncomingCallRingNotification 使来电不断的响铃,直到用户接听电话 
	private void sendIncomingCallRingNotification(int token) {
      	  if (mIsVoiceCapable && !mDoesRilSendMultipleCallRing &&
        	        (token == mCallRingContinueToken)) {
          	  Rlog.d(LOG_TAG, "Sending notifyIncomingRing");
         	   notifyIncomingRing();//判断当前有没有前台call,如果有,停止处理,如果没有,继续....
         	   sendMessageDelayed(
              	      obtainMessage(EVENT_CALL_RING_CONTINUE, token, 0), mCallRingDelay);
      	  } else {
          	  Rlog.d(LOG_TAG, "Ignoring ring notification request,"
              	      + " mDoesRilSendMultipleCallRing=" + mDoesRilSendMultipleCallRing
               	     + " token=" + token
               	     + " mCallRingContinueToken=" + mCallRingContinueToken
               	     + " mIsVoiceCapable=" + mIsVoiceCapable);
        	}
    	}
------------------------------------------------------------------------------------------------------------------------------------------


	private void notifyIncomingRing() {
     	   if (!mIsVoiceCapable)
           	 return;
       	 AsyncResult ar = new AsyncResult(null, this, null);
      	  mIncomingRingRegistrants.notifyRegistrants(ar);
   	 }
mIncomingRingRegistrants的定义及处理:
定义:
CallManager.java
 registerForIncomingRing()-->mIncomingRingRegistrants.addUnique(h, what, obj);registerForPhoneStates()-->phone.registerForIncomingRing(handler, EVENT_INCOMING_RING, null);registerPhone-->registerForPhoneStates(basePhone);处理:
CallManager.java-->handlerMessage():
case EVENT_INCOMING_RING: if (VDBG) Rlog.d(LOG_TAG, " handleMessage (EVENT_INCOMING_RING)"); // The event may come from RIL who's not aware of an ongoing fg call if (!hasActiveFgCall()) { mIncomingRingRegistrants.notifyRegistrants((AsyncResult) msg.obj); } break;不断地notifyRegistrants,不断响铃,直到应用层接受或挂断电话,状态改变为止。------------------------------------------------------------------------------------------------------------------------------------------ Register—notify模型:

这个模型说到底,就是个HandlerMessage的方式。只不过采用了回调的方式后,

形式上更加接近嵌入式硬件上“中断”的处理效果通过在上层进行某个消息A的注册,

将A加入到一个泛型列表RegistrantList中。而当底层的某个事件触发这个已经

注册的Registrant,执行sendMessage的时候,上层注册的消息A就被回调其

handlerMessage方法-,从而响应底层的这个事件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值