来电上报流程

最近项目在做一个双模手机,我负责电话框架层的移植,因此把2.3版的电话模块又梳理了一遍。

今天刚好趁等板子的时间(我们项目很穷的,8个人共用一块板子调试,我的个去啊,要知道刷一次机是很麻烦很费时的。)

把前段时间整理的来电上报流程给帖出来,供拍。

 

框架层的上报流程都是通过通知机制实现的,举个例子:A要监听B的状态,可以在A中实现一个Handler,然后将该Handler注册到B中。即设计模式之观察者模式。

电话部分的通知机制如下图所示:

来电上报流程_第1张图片

图画的比较烂,不好意思从小就没学过美术(当年的美术课都被班主任占了)。

所有电话模块model的改变,都会反映到RIL层上,RIL层提供了各种状态监听列表,提供其它地方注册自己的Handler。framework层的状态从RIL会一直通知到应用层的CallNotifier中。框架层即完成了通知的传递。

 

再来看看来电流程,是如何沿着这条通知链路完成的

首先RIL.RILReceiver线程循环执行读取rild层的信息:readRilMessage

如果读到有新来电过来,则将读取到的字节数组封装到Parcel中,调用processResponse处理Parcel

因为是新来电,属于主动上报,会走processUnsolicited

判断是新来电(RIL_UNSOL_CALL_RING),则调用mRingRegistrant.notifyRegistrant来通知已经注册了来电监听的Handler进行处理

PhoneBase对mRingRegistrant注册了监听,因此其handler会收到消息,然后会调用notifyIncomingRing将注册了自己的mIncomingRingRegistrants监听者发送消息,

CallManager中对Phone注册了mIncomingRingRegistrants监听,CallManager中的Handler会进行处理,执行mIncomingRingRegistrants.notifyRegistrants((AsyncResult) msg.obj);

而CallNotifier中的registerForNotifications方法向CallManager的mIncomingRingRegistrants注册了监听,所以CallNotifier的handler会收到消息进行处理,执行onNewRingingConnection((AsyncResult) msg.obj);

这样就完成了来电从RIL到应用层的传递。

 

你可能感兴趣的:(流程)