消息传递相关数据结构
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对象中还有很多成员,不过流程类似。