首页
登录 | 注册

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();//调用音量状态栏显示
            }


相关文章

  • FROM:http://blog.csdn.net/kevinf_sun/article/details/6789003这篇文章是分析使用SIM卡上网功能的简单分析,并没有涉及到WIFI上网,请大家知悉.通常,如果我们想使用SIM卡拨号上网 ...
  • Android系统源码都有虚拟机GPS HAL层文件gps_qemu.c,移植GPS HAL层修改该文件就可以了.下面将从上到下说明主要修改的地方.修改LOG TAG#define  LOG_TAG  "gps_qemu" ...
  • RTC的驱动移植和JNI修改 唠叨几句,本文目的是: 1>移植hym8563的rtc驱动,硬件板载是S905X,操作系统是Android7.1. 2>从drivers分析道DateTimeSetting.java的执行过程. 首 ...
  • LeaRun.Framework━ .NET快速开发框架 ━ 工作流程组件介绍
    LeaRun.Framework.NET,基于.NET的快速开发框架.整合框架,为企业或个人在.NET环境下快速开发系统提供了强大的支持,开发人员不需要开发系统的基础功能和公共模块,框架自身提供了强大的函数库和开发包,开发人员只须集中精力专 ...
  • 【Xamarin.Android】掌握android支持库
    Android支持库是每个Android应用程序中必不可少的一部分,你会发现它们无处不在.支持库为开发人员提供了将Android的最新和最强大功能添加到应用程序的能力,同时保持与旧版本Android的向后兼容性.随着Android SDK的 ...
  • 综述 UBI全称Unsorted Block Images,是一种原始flash设备的卷管理系统.这个系统能在一个物理的flash设备上管理操纵多个卷并且能在整个flash芯片上实现损耗均衡. 从某种意义上说,UBI和LVM有点相似,LVM ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.014 s.
苏ICP备12049786号-20