<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
    主站蜘蛛池模板: 国产日产成人免费视频在线观看| 亚洲精品成人在线| 久久久久亚洲国产AV麻豆| 亚洲色精品vr一区二区三区| 日韩人妻一区二区三区免费| 亚洲国产日韩a在线播放| 国产成人综合亚洲AV第一页| 91精品成人免费国产片| 边摸边吃奶边做爽免费视频网站| 久久久久亚洲Av片无码v| 嫩草影院在线免费观看| 99在线免费观看| 在线亚洲高清揄拍自拍一品区| 亚洲精品一级无码鲁丝片| 国产在线jyzzjyzz免费麻豆| 精品久久久久久国产免费了| 亚洲制服丝袜第一页| 亚洲乱码国产乱码精品精| 青草草在线视频永久免费| 无码人妻一区二区三区免费看| 亚洲无码一区二区三区| 亚洲国产精品婷婷久久| 亚洲成A人片在线观看中文 | 在线免费播放一级毛片| 日韩亚洲国产综合高清| 亚洲gv猛男gv无码男同短文| 四只虎免费永久观看| 99视频全部免费精品全部四虎| 久久久受www免费人成| 久久精品国产亚洲AV| 亚洲一区在线观看视频| 亚洲国产精品成人久久| 亚洲国产成人精品女人久久久 | 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲91精品麻豆国产系列在线 | 亚洲午夜无码久久久久小说| 国产亚洲无线码一区二区| 四虎永久免费观看| 成年女人毛片免费观看97| 国产激情免费视频在线观看| 一区二区三区免费视频观看|