Kirjaudu
Google-sovellukset
Päävalikko
張貼意見於:
Thinking more...
"Airplane mode"
尚未有任何意見。 -
1 – 0 (共 0 個)
在追bug時,去Trace的結果,後來發現如果Phone的RIL層有問題的話,會造成看起來沒有進Airplane mode但實際上卻已經進去的奇怪現象 。Android裡,選Airplane mode以後會發生的事情:AirplaneModeEnabler送broadcast message出來。有3個人會收到:1.wifi 2.bluetooth 3.Phone。wifi 跟 bluetooth 裡收到訊息以後的處理都很簡單,Phone 裡主要是呼叫 phone.setRadioPower() 這行 (Packages/apps/Phone/src/com/android/phone/PhoneApp.java)。這時候會呼叫 GSMPhone/CDMAPhone 的 setRadioPower,GSMPhone/CDMAPhone 都繼承自 ServiceStateTracker,所以是呼叫 ServiceStateTracker.setRadioPower。ServiceStateTracker.setRadioPower 會呼叫 setPowerStateToDesired (CdmaServiceStateTracker/GsmServiceStateTracker),實際上又是呼叫 cm.setRadioPowercm 的型別是 CommandsInterface,只有 RIL 有實作此 interface (frameworks/base/telephony/java/com/android/internal/telephony/RIL.java)。自此,訊息往下丟到 RIL daemon,參照 reference-ril 裡的 setRadioState,之後處理完會回傳 RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED。RIL.java 的 processUnsolicited() 會處理,這邊會呼叫 setRadioStateFromRILInt(),setRadioStateFromRILInt()裏面又再呼叫 setRadioState (frameworks/base/telephony/java/com/android/internal/telephony/BaseCommands.java),這裡會去 notify,所以根據 mRadioStateChangedRestrants 找 registerForRadioStateChanged()找 registerForRadioStateChanged 的結果,可以看到 GsmServiceStateTracker/CdmaServiceStateTracker 有去呼叫。再看 ServiceStateTracker 裡的 handler 去處理 EVENT_RADIO_STATE_CHANGED 的部份:setPowerStateToDesired() => pollState() => pollStateDone(),pollStateDone() 裏面就可以看到有用 phone.notifyServiceStateChanged(),notifyServiceStateChange 又是呼叫父類別的 notifyServiceStateChangedP()。notifyServiceStateChangedP() 呼叫 mNotifier.notifyServiceState。mNotifier 則是 DefaultPhoneNotifier,再看 DefaultPhoneNotifier,裏面就有 registry.notifyServiceState() (TelephonyRegistry.java),這會再呼叫 broadcastServiceStateChanged()。從這裡的 TelephonyIntents.ACTION_SERVICE_STATE_CHANGED 去找,可以發現只有 PhoneStateIntentReceiver 有收這個 broadcast message。PhoneStateIntentReceiver 會再去 sendMessage。AirplaneModeEnabler 裡就有使用 PhoneStateIntentReceiver,並註冊了自己的 handler,所以 AirplaneModeEnabler 最後就會收到,並且改變項目的狀態。
這段過程幾乎都是以非同步的方式在傳遞,並不是平鋪直敘的,所以我看了好幾次才確定是這麼一回事...沒邊寫邊記的話,恐怕會多繞好幾天...
由 elleryq 在 2010年12月27日 的
下午2:37
所張貼
留下您的意見
您可以使用一些 HTML 標記,例如
<b>, <i>, <a>
已啟用留言管理。所有留言都必須經過網誌作者核准。
請選擇一個身分
Google 帳戶
提交意見後,系統會要求您登入。
名稱 / 網址
使用你的 Google 帳戶留言,日後你才能管理自己的留言。如果選擇匿名留言,則無法編輯或刪除你的留言。
瞭解詳情
名稱
網址
匿名
使用你的 Google 帳戶留言,日後你才能管理自己的留言。如果選擇匿名留言,則無法編輯或刪除你的留言。
瞭解詳情
請回答人機驗證問題
"Airplane mode"
尚未有任何意見。 -