android froyo framework内RIL.java类分析

来源:互联网 发布:手套品牌知乎 编辑:程序博客网 时间:2024/06/12 21:19

这个类用来与ril层进行通信的

比如我要接听一个电话,通过层层调用到RIL.java里面的方法,mCT.acceptCall (Message result)

 929     public void
 930     acceptCall (Message result) {
 931         RILRequest rr
 932                 = RILRequest.obtain(RIL_REQUEST_ANSWER, result);
 933
 934         if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
 935
 936         send(rr);
 937     }
首先形成一个RIL请求,注意里面的RIL_REQUEST_ANSWER,这是一个信号名称,然后调用send(rr);

2072     private void
2073     send(RILRequest rr) {
2074         Message msg;
2075
2076         msg = mSender.obtainMessage(EVENT_SEND, rr);
2077
2078         acquireWakeLock();
2079
2080         msg.sendToTarget();
2081     }
这个函数把RIL请求发给mSender,是一个RILSender类对象,用来发送ril请求的,还有个RILReceiver类,用来接收下面发上来的ril回应

RILSender extends Handler implements Runnable

收到EVENT_SEND信息之后调用handleMessage()

mRequestsList.add(rr); 把请求存进请求列表,这样在RILReceiver接收回应的时候,找到该请求进行通知

data = rr.mp.marshall(); 将请求转换成字节流

s.getOutputStream().write(data);将请求写入socket

 

而在RILReceiver类里面

 520                    for (;;) {
 521                         Parcel p;
 522
 523                         length = readRilMessage(is, buffer);
 524
 525                         if (length < 0) {
 526                             // End-of-stream reached
 527                             break;
 528                         }
 529
 530                         p = Parcel.obtain();
 531                         p.unmarshall(buffer, 0, length);
 532                         p.setDataPosition(0);
 533
 534                         //Log.v(LOG_TAG, "Read packet: " + length + " bytes");
 535
 536                         processResponse(p);
 537                         p.recycle();
 538                     }
不断的从socket里面读数据,然后进行结构化诚Parcel对象p,调用processResponse(p)去处理回应, 若得到的回应有效调用processSolicited (p);

在那里面,根据serial = p.readInt();找到原先的请求,也就是RILRequest对象,从请求列表里面删除

然后找到rr.mRequest为RIL_QUESET_ANSER进行处理,然后

2264                     AsyncResult.forMessage(rr.mResult, null, tr);
2265                     rr.mResult.sendToTarget();
这样就完成了处理整个过程了

原创粉丝点击