<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
    主站蜘蛛池模板: 国产无遮挡吃胸膜奶免费看视频 | 亚洲国产精品无码专区| 狠狠综合久久综合88亚洲| 亚洲国产成人高清在线观看| 亚洲高清在线播放| 久久亚洲AV无码精品色午夜麻豆| 亚洲av永久无码精品三区在线4 | 亚洲国产欧美一区二区三区| 黄色网址免费在线| 13小箩利洗澡无码视频网站免费| 三年片在线观看免费观看大全一| 国产va免费精品观看精品| 国产真实伦在线视频免费观看| 亚洲日韩VA无码中文字幕| 亚洲精品天天影视综合网| 亚洲色欲色欱wwW在线| 一级做a毛片免费视频| 久久国产精品国产自线拍免费| 国产人在线成免费视频| 亚洲精品乱码久久久久久蜜桃 | 色天使色婷婷在线影院亚洲| 中国人免费观看高清在线观看二区| 69视频在线是免费观看| 四虎永久在线精品免费观看地址| 亚洲五月综合缴情在线观看| 91亚洲精品麻豆| 免费福利在线观看| 亚洲毛片在线免费观看| 免费午夜爽爽爽WWW视频十八禁| 久久亚洲国产精品| 国产精品亚洲一区二区三区| 好久久免费视频高清| 精品国产一区二区三区免费看| 亚洲精品你懂的在线观看| 亚洲欧美综合精品成人导航| 中文字幕无线码免费人妻| 国产精品久久久久久久久久免费| 亚洲日韩一页精品发布| 亚洲国产欧洲综合997久久| 少妇人妻偷人精品免费视频| 丁香亚洲综合五月天婷婷|