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

}

android 代码控制音量,Android的framework层音量控制原理分析--hot(key)处理相关推荐

  1. Android wifi探究二:Wifi framework层源码分析

    上一篇博客初步认识了wpa_supplicant的作用和使用方法,并且尝试着梳理了wifi的大框架,不过,java层的框架我们忽略了,没有分析,也就是说上一篇博客简单的指出了wifi代码的大框架,那么 ...

  2. android代码控制微信,Android转战微信小程序 - vscode安装和配置

    前言 前一篇文章稍微总结了微信小程序的一些简单入门用法,这一篇文章说一下开发工具的选择,其实作为一个初次接触的萌新,微信开发者工具就能很好的作为日常的开发了,本人之所以选择vscode是刚入门时被一前 ...

  3. 从Android应用层及Framework层的角度分析WakeLock锁机制

      从Android应用层及Framework层的角度分析WakeLock锁机制 本篇博客编写思路总结和关键点说明: 为了更加方便的读者阅读博客,通过导读思维图的形式将本博客的关键点列举出来,从而方便 ...

  4. android中如何打开指定卡上的数据连接开关,Android 代码控制手机数据网络的开关(5.0以上)...

    Android 代码控制手机数据网络的开关 文章目录 android 5.0以前 5.0以后 Code android 5.0以前 Android 5.0以前使用ConnectivityManager ...

  5. android 方向控制界面,Android Studio屏幕方向以及UI界面状态的保存代码详解

    项目:orientation package com.example.orientation; import android.os.bundle; import android.util.log; i ...

  6. android代码查找图像,Android平台上利用opencv进行图像的边沿检测

    原标题:Android平台上利用opencv进行图像的边沿检测 近开始接触opencv for Android,从网上down了图像的边沿检测的代码. 测试图片: 在Android2.3.1模拟器上跑 ...

  7. android 摇杆控制方向键,Android Studio中实现摇杆

    今天和大家分享一下Android Studio实现摇杆,原理很简单,代码中有对应的注释. 实现效果图 实现代码 package com.example.fragmentcar1.view; impor ...

  8. Android代码混淆处理,android代码混淆解决方案

    以下包含了常见的基本代码与一些三方框架的混淆方案. ##########################基本混淆参数###################### # 代码混淆压缩比,在0~7之间,默认 ...

  9. android代码说明文档,android:label说明

    文章目录 1. 说明 android:label 用于app 在切换activity的时候,自动更换左上角的显示 2. 代码架构 3. String.xml 字符串资源文件My Application ...

  10. android 代码加view,Android中将View添加至窗口的源码分析

    本文主要内容是讲解一个视图View或者一个ViewGroup对象是如何添加至应用程序窗口中的.下文中提到的窗口可泛指我们能看到的界面,包括一个Activity呈现的界面(我们可以将之理解为应用程序窗口 ...

最新文章

  1. Android UI体验之全屏沉浸式透明状态栏效果
  2. f5申请并激活License
  3. 二值mask图像 + RGB原图 生成可视化分割结果; 从二值mask获取分割轮廓点
  4. 研究生的研究人员发展课程
  5. CF1245F Daniel and Spring Cleaning(等会了更新)
  6. 【CodeForces - 722D】Generating Sets(二分,贪心)
  7. LeetCode 216. 组合总和 III(排列组合 回溯)
  8. linux设备分层优点,Linux设备驱动的分层设计思想
  9. Spring Cloud 入门 之 Eureka 篇(一)
  10. 类的变量初始化是直接使用初始化器还是放在构造函数中?
  11. 通过反编译让SpecFlow支持多层属性值的验证
  12. 爬虫实例7 爬取豆瓣电影数据 (json+ajax)
  13. BSP和JSP里的UI元素ID生成逻辑 1
  14. android安装管理,android-使用下载管理器下载后安装apk,并退出...
  15. 纽约亮马河邮轮 - 从水上欣赏纽约迷人景色
  16. sklearn中predict_proba用法(注意和predict的区别)
  17. 服务器系统的监测,服务器监测系统
  18. asp.net错误解决:Unable to Validate Data in ASP.NET website
  19. 路缘石滑模机对于公路施工的适用性分析
  20. Unity 报错TLS Allocator ALLOC_TEMP_THREAD, underlying allocator ALLOC_TEMP_THREAD

热门文章

  1. 分布式协调服务Zookeeper集群搭建
  2. vector canoe 12/13/14/15 CANape 19 ASAP2 16 Canoe 15 lin flexray diva j1939 ethernet car2x scope
  3. AXI4 / AXI4-Lite / AXI4-Stream
  4. mysql数据库,oracle数据库中对字段的拼接方法
  5. 数据结构 - 约瑟夫环
  6. 艾默生分析仪1066-P-HT-60安装注意事项
  7. [Valkyrie网络测试仪-软件使用技巧] - Scheduler动作录制,定制打流过程(中途启停/调整带宽/使能部分流量)
  8. 服务器无法打开.rar文件,linux服务器无法解压rar文件的解决方法
  9. Failed to start SYSV: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited for high。。。
  10. 读《我的管理哲学 - 任正非》