Android的framework層音量控制原理分析--hot(key)處理 Android.media.AudioManager中包含了對android.media.AudioService的跨進(jìn)程AIDL調(diào)用封裝,。 正常處理過程: 1.調(diào)整音量是通過AudioManager間接調(diào)用AudioService.adjustStreamVolume方法來完成邏輯處理; 2.AudioService調(diào)用VolumePanel畫出音量調(diào)整界面,,并發(fā)送音量變動廣播消息, 3.StatusBarPolicy,,接收廣播消息判斷是否在狀態(tài)欄顯示靜音或振動圖標(biāo),。 問題點: 1.AudioManager如何接收音量調(diào)整事件? 答:PhoneWindowManager.interceptKeyBeforeQueueing處理的 2.誰負(fù)責(zé)處理音量顯示的,? 答:AudioManager調(diào)用AudioService來顯示的,。事件觸發(fā)在AudioManager,代碼的執(zhí)行實現(xiàn)在AudioService中,。狀態(tài)欄是SystemUI的APK包StatusBarPolicy中接收廣播消息來處理的,。 源碼位置: /frameworks/base/media/java/android/media/AudioManager.java /frameworks/base/media/java/android/media/AudioService.java /framework/base/core/java/Android/view/VolumePanel.java /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java AudioService.adjustStreamVolume方法完成以下三個功能: 一.音量調(diào)整 音量調(diào)整分為兩步:先查看模式(Ring mode)是否需要調(diào)整? 然后再調(diào)用調(diào)整音量。 調(diào)整模式通過調(diào)用checkForRingerModeChange(oldIndex, direction);實現(xiàn),, 調(diào)整音量通過調(diào)用streamState.adjustIndex(direction)實現(xiàn),。 二.向用戶顯示調(diào)整音量的界面 調(diào)用mVolumePanel.postVolumeChanged(streamType, flags);發(fā)送音量變動消息,向用戶顯示改變結(jié)果,。 調(diào)用過程VolumePanel.postVolumeChanged->VolumePanel.onVolumeChanged->VolumePanel.onShowVolumeChanged->mToast 三.廣播音量有變動的系統(tǒng)事件 AudioService.sendVolumeUpdate(streamType);廣播音量有改變的系統(tǒng)事件,,狀態(tài)欄根據(jù)這廣播事件顯示靜音或振動圖標(biāo) 狀態(tài)欄的靜音或振動圖標(biāo)顯示過程 StatusBarPolicy主要負(fù)責(zé)在靜音模式(silent mode)和振動模式(vibrate mode)下在狀態(tài)欄(status bar)的右方顯示一個代表相應(yīng)意義的圖標(biāo)。 一.系統(tǒng)啟動后,,StatusBarPolicy會注冊一個Receiver,,它可以接收很多種廣播,其中就有AudioService在完成每一次的模式和音量更新時發(fā)出的兩個廣播事件 private BroadcastReceiver mIntentReceiver = new BroadcastReceiver()//新一個廣播接收類‘ mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);//注冊一個Receiver,,接收廣播消息 二.接收廣播,,并調(diào)用updateVolume調(diào)整狀態(tài)欄顯示 else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) || action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) { updateVolume();//調(diào)用音量狀態(tài)欄顯示 } |
|
來自: John.Bouson > 《HAL》