Android_Phone 源代码来电流程解读
来自陈显的博客 http://www.cnblogs.com/chenxian/
***************************CallNotier***************************
本类 extends Handler 并且 implements
CallerInfoAsyncQuery.OnQueryCompleteListener
$$ 电话状态改变之后本类会接到 Message,然后本 Handler 通过 Message 的不同,进
入不同的 case:
$$ 然后调用不同的方法处理各种状态改变。
$$ 同时实现了 OnQueryCompleteListener 接口,当来电的时候会帮助执行查询操作,
比如查询并调用
$$ Ringer 设置响铃方式。
当来电时,本类会接受到一个
PHONE_NEW_RINGING_CONNECTION(Message.what),然后调用对应的方法
$$ onNewRingingConnection(),该方法又会调用 startIncomingCallQuery()方法,该
方法就查询用户
设置的铃声(可能是系统的,也可能是用户自定义的),如果查询完成则直接调用
onQueryComplete().
$$ 假如执行超时的话,将会发送一个延时 Message,延时后将默认调用系统的铃声。
$$ 假如在延时发送 Message 过程中 Query 已经完成,由于 CallNotier 实现了
OnQueryCopleteListener,
$$ 就会自动调用 onQueryComplete()方法,该方法将会首先把可能存在的延时
Message 给 Remove,以防止
$$ 再次设置铃声。接着调用 onCustomRingQueryComplete()方法。然后该方法里面会
调用 Ringer 的 ring()
$$ 方法启动响铃。
********************************Ringer***************************
Ringer 的 ring()方法会启动相应的响铃方式。
响铃之后将会又 Message 发送,其内容为 PHONE_STATE_CHANGED
*******************************InCallScreen**********************
InCallScreen 将会接受到发送的 PHONE_STATE_CHANGED 消息,然后调用
onPhoneStateChanged()方法
该方法将更新屏幕,CallNotier 的 onCustomRingQueryComplete 里也会通过
PhoneUtils.showIncomingCallUi()
来启动 InCallScreen 屏幕。然后由 InCallScreen 处理,处理方式与前面打电话的大体一
致,不过该类第一次调用时执行了
onCreate()方法,但是以后执行都是从 onNewIntent()开始.
Android_Phone 源代码拨打电话解读