小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Android的framework層音量控制原理分析

 John.Bouson 2011-12-19

Android的framework層音量控制原理分析--hot(key)處理

分類: Android 170人閱讀 評(píng)論(0) 收藏 舉報(bào)
Android的framework層音量控制原理分析--hot(key)處理

Android.media.AudioManager中包含了對(duì)android.media.AudioService的跨進(jìn)程AIDL調(diào)用封裝。
正常處理過程:
1.調(diào)整音量是通過AudioManager間接調(diào)用AudioService.adjustStreamVolume方法來完成邏輯處理;
2.AudioService調(diào)用VolumePanel畫出音量調(diào)整界面,并發(fā)送音量變動(dòng)廣播消息,
3.StatusBarPolicy,接收廣播消息判斷是否在狀態(tài)欄顯示靜音或振動(dòng)圖標(biāo)。

問題點(diǎn):
1.AudioManager如何接收音量調(diào)整事件?

答:PhoneWindowManager.interceptKeyBeforeQueueing處理的
WindowManagerService循環(huán)讀取下面的消息再做分發(fā)到窗口接收,在消息分發(fā)前會(huì)有一個(gè)類做消息過濾處理,就是PhoneWindowManager.interceptKeyBeforeQueueing;
比如音量調(diào)整、Home鍵都在這個(gè)類里面做特殊處理,詳細(xì)內(nèi)容后面會(huì)在其它該當(dāng)再補(bǔ)充


2.誰負(fù)責(zé)處理音量顯示的?
答:AudioManager調(diào)用AudioService來顯示的。事件觸發(fā)在AudioManager,代碼的執(zhí)行實(shí)現(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方法完成以下三個(gè)功能:
一.音量調(diào)整
音量調(diào)整分為兩步:先查看模式(Ring mode)是否需要調(diào)整? 然后再調(diào)用調(diào)整音量。 
調(diào)整模式通過調(diào)用checkForRingerModeChange(oldIndex, direction);實(shí)現(xiàn),
調(diào)整音量通過調(diào)用streamState.adjustIndex(direction)實(shí)現(xiàn)。

二.向用戶顯示調(diào)整音量的界面
調(diào)用mVolumePanel.postVolumeChanged(streamType, flags);發(fā)送音量變動(dòng)消息,向用戶顯示改變結(jié)果。
調(diào)用過程VolumePanel.postVolumeChanged->VolumePanel.onVolumeChanged->VolumePanel.onShowVolumeChanged->mToast

三.廣播音量有變動(dòng)的系統(tǒng)事件
AudioService.sendVolumeUpdate(streamType);廣播音量有改變的系統(tǒng)事件,狀態(tài)欄根據(jù)這廣播事件顯示靜音或振動(dòng)圖標(biāo)

狀態(tài)欄的靜音或振動(dòng)圖標(biāo)顯示過程
StatusBarPolicy主要負(fù)責(zé)在靜音模式(silent mode)和振動(dòng)模式(vibrate mode)下在狀態(tài)欄(status bar)的右方顯示一個(gè)代表相應(yīng)意義的圖標(biāo)。
一.系統(tǒng)啟動(dòng)后,StatusBarPolicy會(huì)注冊(cè)一個(gè)Receiver,它可以接收很多種廣播,其中就有AudioService在完成每一次的模式和音量更新時(shí)發(fā)出的兩個(gè)廣播事件

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver()//新一個(gè)廣播接收類‘
        filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);//添加接收的廣播消息

        filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);//注冊(cè)一個(gè)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)欄顯示
            }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多