<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 189,comments - 115,trackbacks - 0
    Android的framework層音量控制原理分析--hot(key)處理

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

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

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


    2.誰(shuí)負(fù)責(zé)處理音量顯示的?
    答:AudioManager調(diào)用AudioService來(lái)顯示的。事件觸發(fā)在AudioManager,代碼的執(zhí)行實(shí)現(xiàn)在AudioService中。狀態(tài)欄是SystemUI的APK包StatusBarPolicy中接收廣播消息來(lái)處理的。

    源碼位置:
    /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)整模式通過(guò)調(diào)用checkForRingerModeChange(oldIndex, direction);實(shí)現(xiàn),
    調(diào)整音量通過(guò)調(diào)用streamState.adjustIndex(direction)實(shí)現(xiàn)。

    二.向用戶顯示調(diào)整音量的界面
    調(diào)用mVolumePanel.postVolumeChanged(streamType, flags);發(fā)送音量變動(dòng)消息,向用戶顯示改變結(jié)果。
    調(diào)用過(guò)程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)顯示過(guò)程
    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)欄顯示
                }

    養(yǎng)成勵(lì)志的習(xí)慣,一生勵(lì)志   

    22本經(jīng)典英語(yǔ)口語(yǔ)教程  

    技術(shù)開發(fā)海量資料下載導(dǎo)航 

    30本經(jīng)典Linux學(xué)習(xí)和開發(fā)教程和資料 

    15本經(jīng)典C、C++、MFC、VC++教程

    10本經(jīng)典Java教程

    15本經(jīng)典Android教程和海量Android源碼

     

     

     

    posted on 2012-02-08 09:22 MEYE 閱讀(2816) 評(píng)論(0)  編輯  收藏 所屬分類: Android3D
    主站蜘蛛池模板: 免费看www视频| 免费无遮挡无码视频网站| 国产成人精品免费视频大| 成全视频免费高清| xvideos亚洲永久网址| 国产亚洲A∨片在线观看| 777亚洲精品乱码久久久久久 | 热久久精品免费视频| 亚洲日本一区二区一本一道| 亚洲AV永久无码精品一百度影院| 亚洲日本国产乱码va在线观看| 中文字幕亚洲情99在线| 一级做a爰片性色毛片免费网站| 四虎影视无码永久免费| av大片在线无码免费| 国产一级高清免费观看| 亚洲av伊人久久综合密臀性色 | 免费看的黄色大片| 亚洲成a人片在线观看久| 亚洲成AV人片在线观看无| 亚洲国产人成在线观看| 相泽南亚洲一区二区在线播放| 99在线免费视频| 无码专区永久免费AV网站| 亚洲片国产一区一级在线观看 | 99视频在线精品免费| 日韩中文无码有码免费视频| 亚洲av无码一区二区三区不卡| 亚洲中文字幕无码av永久| 成人网站免费大全日韩国产| 免费视频专区一国产盗摄| 2022中文字字幕久亚洲| 亚洲一区二区三区高清视频| 色多多A级毛片免费看| 亚洲高清免费在线观看| 亚洲美女在线国产| 亚洲sss综合天堂久久久| 你懂的免费在线观看| 免费观看男人免费桶女人视频| 久久国产精品亚洲一区二区| 精品无码专区亚洲|