<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中包含了對android.media.AudioService的跨進程AIDL調用封裝。
    正常處理過程:
    1.調整音量是通過AudioManager間接調用AudioService.adjustStreamVolume方法來完成邏輯處理;
    2.AudioService調用VolumePanel畫出音量調整界面,并發送音量變動廣播消息,
    3.StatusBarPolicy,接收廣播消息判斷是否在狀態欄顯示靜音或振動圖標。

    問題點:
    1.AudioManager如何接收音量調整事件?

    答:PhoneWindowManager.interceptKeyBeforeQueueing處理的
    WindowManagerService循環讀取下面的消息再做分發到窗口接收,在消息分發前會有一個類做消息過濾處理,就是PhoneWindowManager.interceptKeyBeforeQueueing;
    比如音量調整、Home鍵都在這個類里面做特殊處理,詳細內容后面會在其它該當再補充


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

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

    三.廣播音量有變動的系統事件
    AudioService.sendVolumeUpdate(streamType);廣播音量有改變的系統事件,狀態欄根據這廣播事件顯示靜音或振動圖標

    狀態欄的靜音或振動圖標顯示過程
    StatusBarPolicy主要負責在靜音模式(silent mode)和振動模式(vibrate mode)下在狀態欄(status bar)的右方顯示一個代表相應意義的圖標。
    一.系統啟動后,StatusBarPolicy會注冊一個Receiver,它可以接收很多種廣播,其中就有AudioService在完成每一次的模式和音量更新時發出的兩個廣播事件

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

            filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);
    mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);//注冊一個Receiver,接收廣播消息

    二.接收廣播,并調用updateVolume調整狀態欄顯示
    else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||
                        action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {
                    updateVolume();//調用音量狀態欄顯示
                }

    養成勵志的習慣,一生勵志   

    22本經典英語口語教程  

    技術開發海量資料下載導航 

    30本經典Linux學習和開發教程和資料 

    15本經典C、C++、MFC、VC++教程

    10本經典Java教程

    15本經典Android教程和海量Android源碼

     

     

     

    posted on 2012-02-08 09:22 MEYE 閱讀(2816) 評論(0)  編輯  收藏 所屬分類: Android3D
    主站蜘蛛池模板: 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 亚洲黄网在线观看| 国产精品福利在线观看免费不卡| 日韩午夜免费视频| 麻豆亚洲AV成人无码久久精品| 在线看片无码永久免费aⅴ| www亚洲精品久久久乳| 免费a级毛片无码a∨性按摩| 免费一级全黄少妇性色生活片| 亚洲欧洲久久av| 光棍天堂免费手机观看在线观看| 久久久亚洲精品国产| 日韩人妻无码精品久久免费一 | 国产av天堂亚洲国产av天堂| 黄色免费在线网站| 亚洲综合激情视频| 毛片免费观看的视频在线| 在线看亚洲十八禁网站| 国产亚洲日韩在线三区| 一级毛片免费毛片一级毛片免费 | 亚洲乱码日产精品一二三| 亚洲国产精品第一区二区三区| 老司机精品免费视频| 亚洲网址在线观看| 日韩中文无码有码免费视频| a免费毛片在线播放| 亚洲一区二区三区首页| 夫妻免费无码V看片| 中文字幕在线观看免费| 亚洲影视一区二区| 免费大黄网站在线观| 国产激情免费视频在线观看| 亚洲 欧洲 视频 伦小说| 亚洲国产成人久久综合碰| 亚洲精品免费在线观看| 激情婷婷成人亚洲综合| 亚洲精品成人av在线| 日本v片免费一区二区三区| 国产免费一区二区三区在线观看| 国产精品亚洲精品青青青| 亚洲精品中文字幕乱码三区|