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

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

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

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


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

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

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

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

          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,接收廣播消息

          二.接收廣播,并調(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)成勵志的習(xí)慣,一生勵志   

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

          技術(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 閱讀(2818) 評論(0)  編輯  收藏 所屬分類: Android3D
          主站蜘蛛池模板: 留坝县| 石棉县| 隆尧县| 丰都县| 绥化市| 滁州市| 齐齐哈尔市| 乐业县| 甘南县| 河北区| 敦煌市| 沅江市| 涿鹿县| 四会市| 喀什市| 莱西市| 陕西省| 通河县| 平南县| 如皋市| 万州区| 镇巴县| 连江县| 固原市| 兴化市| 招远市| 威远县| 柏乡县| 乌拉特中旗| 华宁县| 广安市| 安国市| 财经| 南和县| 阿勒泰市| 白朗县| 林周县| 孝昌县| 阿拉善左旗| 交口县| 会宁县|