這個類用來與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();
這樣就完成了處理整個過程了