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方法-,从而响应底层的这个事件。