Telephony理解
今天看了看framework里面的telephony相關的代碼。。。做個小筆記吧.
路徑位于
frameworks/base/telephony/
首先是Ril相關的。上層的所有對電話的操作和狀態 獲取等都是通過Ril來實現的,Ril通過發送命令與底層rild進行交互。
?
CommandsInterface是一個接口,他 定義了操作相關的命令、方法和監聽等。。。
BaseCommands則直接繼承了CommandsInterface接口。。
Ril繼承自BaseCommands,并且負責通過socket與rild通信。。。它將對電話的操作(如:hangupConnection())轉換成為了對應的
RIL_REQUEST_XXX發送到rild
RILReceiver則實現了Runnable接口。即啟動一個循環一直監聽socket,看底層是否發送相關的信息。收到respone進行相關處理后執行processResponse()方法
該方法內通過判斷type分別執行processUnsolicited (p)和processSolicited (p)方法,這也就能獲取電話狀態等消息。
這里將會根據不同的response而通知相應的已經注冊了監聽的對象(通過RegistrantList的notifyRegistrants通知,之前已經通過phonebase的RegisterFor***changed方法注冊).
注冊的時候將會把Handle和Messae.what等注冊進一個RegistrantList實例(加入一個arrayList),Ril收到response之后也是通過RegistrantList來將相應的信息返回給已經注冊
的實例對象。
CallTracker就注冊了相應的監聽。所以當有對應的Response的時候,就會返回給CallTracker,然后CallTracker進行相應的處理,比如updatePhoneStae等。。。
在updatePhoneStae方法里又會調用對應的phone.notifyPhoneStateChanged(根據電話類型分為GSMPhone和CDMAPhone).在此方法內Phone對象又會調用PhoneNotifier.notifyPhoneState
方法。
PhoneNotifier是一個接口定義了電話狀態改變,信號改變的通知等方法。具體的實現是在DefaultPhoneNotifier里面.這里就會將具體的電話事件轉換為函數調用,通知TelephonyRegistry
TelephonyRegistry就會將電話事件給通知出去,這里分兩種類型通知。1是通過廣播發送,2是通過之前注冊的Listener回調回去。
至此,電話事件就對第三方應用可見了。第三方應用就可以通過接受廣播或者TelephonyManager.listen()方法監聽到電話時間而進行相應的處理。
?
轉載于:https://www.cnblogs.com/chenxian/archive/2011/03/03/1970063.html
總結
以上是生活随笔為你收集整理的Telephony理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (三)bossGroup, workGr
- 下一篇: 浏览器的滚动条滚动时,导航条的背景变色