android froyo framework內RIL.java類分析

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.