telephony framework中的消息传递

本文详细解析了Android系统中消息传递的核心数据结构,包括Registrant、AsyncResult及RegistrantList的使用方式与工作流程,并以PhoneBase类中的精确呼叫状态变化为例,展示了整个消息通知的过程。

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

消息传递相关数据结构

Registrant

frameworks/base/core/java/android/os/Registrant.java

    public
    Registrant(Handler h, int what, Object obj)
    {
        refH = new WeakReference(h);
        this.what = what;
        userObj = obj;
    }
    WeakReference   refH; //Handler,通过它能找到消息队列
    int             what; //消息类型
    Object          userObj; //用户自定义的对象
该类有三个成员,构造方法中对应初始化这三个成员。
  public void
    notifyRegistrant()
    {
        internalNotifyRegistrant (null, null);
    }
   /*package*/ void
    internalNotifyRegistrant (Object result, Throwable exception)
    {
        Handler h = getHandler();

        if (h == null) {
            clear();        
        } else {
            Message msg = Message.obtain();
            msg.what = what;           
            msg.obj = new AsyncResult(userObj, result, exception);            
            h.sendMessage(msg);
        }
    }
发送通知就是往对应的Handler发送类型为what,obj为AsyncResult的消息

AsyncResult

frameworks/base/core/java/android/os/AsyncResult.java

    public Object userObj; //用户传入的对象
    public Throwable exception; //异常,如果有的话
    public Object result;//返回的结果放在这里
这个类更简单,只有三个成员

RegistrantList

frameworks/base/core/java/android/os/RegistrantList.java
    ArrayList   registrants = new ArrayList();    
就是和名字一样,包含一个Registrant的列表

使用

frameworks/opt/telephony/src/java/com/android/internal/telephony/PhoneBase.java
    protected final RegistrantList mPreciseCallStateRegistrants
            = new RegistrantList();
    @Override
    public void registerForPreciseCallStateChanged(Handler h, int what, Object obj) { //注册
        checkCorrectThread(h);

        mPreciseCallStateRegistrants.addUnique(h, what, obj);
    }

    // Inherited documentation suffices.
    @Override
    public void unregisterForPreciseCallStateChanged(Handler h) { //反注册
        mPreciseCallStateRegistrants.remove(h);
    }

    /**
     * Subclasses of Phone probably want to replace this with a
     * version scoped to their packages
     */
    protected void notifyPreciseCallStateChangedP() { //发送通知
        AsyncResult ar = new AsyncResult(null, this, null);
        mPreciseCallStateRegistrants.notifyRegistrants(ar);
        ...
    }
上面的是所有使用RegistrantList的模板代码,telephony framework中消息传递就靠它了。

传递流程

就拿PhoneBase中的mPreciseCallStateRegistrants举例,从下到上

RIL

frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java
    @Override
    public void
    getCurrentCalls (Message result) {
        RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result);
        send(rr);
    }
getCurrentCalls的作用见 点击打开链接。发送ril请求,通过socket发送到ril daemon去处理,处理完毕后通过socket返回数据(这个流程网上早有介绍了,可以搜索“Android ril”查找),然后主动请求会通过processSolicited处理
  private RILRequest
    processSolicited (Parcel p) {
      ...
      case RIL_REQUEST_GET_CURRENT_CALLS: ret =  responseCallList(p); break;
      ...
      AsyncResult.forMessage(rr.mResult, ret, null); //rr.mResult就是getCurrentCalls中传递进去的result,是个Message
      rr.mResult.sendToTarget(); //发送到相应handler中处理
      ...
  }

GsmCallTracker

frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmCallTracker.java
             case EVENT_POLL_CALLS_RESULT:
                ...
                handlePollCalls((AsyncResult)msg.obj);
   protected synchronized void
    handlePollCalls(AsyncResult ar) {
        ...
        mPhone.notifyPreciseCallStateChanged();
        ...
    }

GSMPhone

frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GSMPhone.java
    /*package*/ void notifyPreciseCallStateChanged() {
        /* we'd love it if this was package-scoped*/
        super.notifyPreciseCallStateChangedP();
    }

PhoneBase

然后走到PhoneBase,然后往哪里去?注册监听该消息的是

CallManager

frameworks/opt/telephony/src/java/com/android/internal/telephony/CallManager.java
    private void registerForPhoneStates(Phone phone) {
        ...
        phone.registerForPreciseCallStateChanged(handler, EVENT_PRECISE_CALL_STATE_CHANGED, null);
        ...
    }
registerForPhoneStates被调用的地方就跑到Telephony app中的代码了,不再继续分析。发送消息在handlerMessage中:
                case EVENT_PRECISE_CALL_STATE_CHANGED:
                    mPreciseCallStateRegistrants.notifyRegistrants((AsyncResult) msg.obj);
                    break;
整个telephony framework的流程就走完了,除了CallTracker之外,Phone对象中还有很多成员,不过流程类似。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值