Android的StatusBar分析

 

这里仅讨论状态栏右半部分,不包括Notification部分。开机初始化相关略。以电池电量显示为例,大概关键步骤如下:

1 通过BroadcastReceiver机制,StatusBarPolicy中注册的mIntentReceiver收到BatteryService广播的ACTION_BATTERY_CHANGED事件触发;

2 调用updateBattery(intent)开始更新电池状态栏;

3 从intent中解析需要的字段,调用StatusBarManager的setIcon()。StatusBarManager是客户端使用的状态栏管理类;

4 通过IBinder机制跨进程调用StatusBarManagerService的setIcon()。StatusBarManagerService派生于IStatusBarService.Stub,是状态栏管理的服务端,是具体实现;

5 StatusBarManagerService有一个StatusBarIconList成员,这个list成员在StatusBarManagerService创建时,从R.array.config_statusBarIcons加载生成。StatusBarManagerService的setIcon()过程中,会又"battery"字段获得在StatusBarIconList中的索引,再由包名、图片id和等级创建StatusBarIcon实例,并将这个实例更新StatusBarIconList中所获得索引对应项;

6 调用CommandQueue的setIcon()。CommandQueue派生于IStatusBar.Stub,有一个内部接口Callbacks,这个接口的实现就是StatusBarService。CommandQueue、StatusBarService和StatusBarManager属于同一个进程,而StatusBarManagerService是一个系统级服务,它们之间必然需要通过IBinder进程间通信;

7 CommandQueue用于处理状态栏、通知相关的请求,内部维护了一个事件队列,setIcon()会创建一个OP_SET_ICON的massege,发送给Handler处理;

8 CommandQueue内部也有一个StatusBarIconList实例,这个实例是由StatusBarService创建。在处理OP_SET_ICON的massege前,会先通过getViewIndex获得图标View的位置索引viewIndex,(因为有些图标有可能为空)再更新StatusBarIconList,最后调用Callbacks,也就是StatusBarService的addIcon()或者updateIcon();

9 以addIcon()为例,StatusBarService的addIcon()会创建一个新的StatusBarIconView,将第5步中所创建的StatusBarIcon实例设置进去,然后把这个view添加到LinearLayout的viewIndex位置。

这样一个电池相关图标就在状态栏上添加或者更新了。删除操作类似。

另:

IStatusBarService.aidl和IStatusBar.aidl在platform\frameworks\base\core\java\com\android\internal\statusbar中


    <string-array name="config_statusBarIcons">
       <item><xliff:g id="id">ime</xliff:g></item>
       <item><xliff:g id="id">sync_failing</xliff:g></item>
       <item><xliff:g id="id">sync_active</xliff:g></item>
       <item><xliff:g id="id">gps</xliff:g></item>
       <item><xliff:g id="id">bluetooth</xliff:g></item>
       <item><xliff:g id="id">nfc</xliff:g></item>
       <item><xliff:g id="id">tty</xliff:g></item>
       <item><xliff:g id="id">speakerphone</xliff:g></item>
       <item><xliff:g id="id">mute</xliff:g></item>
       <item><xliff:g id="id">volume</xliff:g></item>
       <item><xliff:g id="id">wifi</xliff:g></item>
       <item><xliff:g id="id">cdma_eri</xliff:g></item>
       <item><xliff:g id="id">data_connection</xliff:g></item>
       <item><xliff:g id="id">phone_evdo_signal</xliff:g></item>
       <item><xliff:g id="id">phone_signal</xliff:g></item>
       <item><xliff:g id="id">battery</xliff:g></item>
       <item><xliff:g id="id">alarm_clock</xliff:g></item>
       <item><xliff:g id="id">secure</xliff:g></item>
       <item><xliff:g id="id">clock</xliff:g></item>
    </string-array>

 

详细序列图如下:

时间: 2024-12-22 21:53:47

Android的StatusBar分析的相关文章

Android 源码分析,FreeMind 是一件超级利器

Android 源码分析,FreeMind 是一件超级利器 思维导图软件 XMind 与 FreeMind 的对比 作者: 善用佳软 日期: 2012-04-17 分类: 1 文本办公, 1.5 思维导图 标签: mindmap 思维导图类软件中,最有影响力的开源免费软件是 FreeMind 和 XMind.FreeMind历史悠久,当属经典:XMind作为后起之秀,大有赶超之势.同作为免费.开源的思维导图解决方案,应如何选择/结合两款软件?本文试做分析,以供用户/开发者参考. 本文的分析基于W

android 状态栏(StatusBar)

一.SystemUI 概述         自 android2.2 开始 , 原本存在与 framework-res.apk 中的状态栏和下拉通知栏界面控制被分割出一个单独的 apk文件 , 命名为 SystemUI.apk, 保存在 System/app 文件夹中.在 SystemUI.apk 中 , 是存在着状态栏的图标 ,XML 和控制文件等 , 这样的分割 , 使我们可以更方便地去修改. SystemUI 模块中主要包含了 USB 和 Statusbar 两个子模块,本文将以 Stat

Pury — 一个新的 Android App 性能分析工具

本文讲的是Pury - 一个新的 Android App 性能分析工具, 手机应用存在的目的,就是在帮助用户做他们想做的事情的同时,提供最好的用户体验 -- 而用户体验的重中之重是应用的性能.但有时候开发者们却以性能为借口,既没有达到既定目标,又写着低质量并难以维护的代码.在这里我想引用 Michael A. Jackson 的一句话: "程序优化守则第一条:别去做它.程序优化守则第二条(仅限于专业人员):别去做它,现在还不是时候." 在开始任何优化之前,我们要先认清问题的症结所在.

Android源码分析-Alarm机制与Binder的交互

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/18448997 前言 本次给大家分析的是Android中Alarm的机制以及它和Binder的交互,所用源码为最新的Android4.4.因为Alarm的功能都是通过Binder来完成的,所以,介绍Alarm之前必须要先介绍下它是如何调用Binder来完成定时功能的.由于内容较多,本文会比较长,在文章结构安排上是这样的:首先简单介绍如何使用Alarm并给出其工作原理,接着分析

android车载娱乐系统跟android平板的分析比较

android车载娱乐系统跟android平板的分析比较              随着android系统风靡世界,艳冠全球,逐渐进入了各个电子应用领域,车载电子在android系统的应用上属于稍微晚一点的行业.近一年多来,市面上的android车载导航主机已有露面,但是由于导航显示屏比较小,核心功能导航.倒车等相对WINCE来说,体现不出优越性,WINCE系统响应时间更短.稳定性更好一些,WINCE功能虽然简单一点.但是在后座娱乐方面WINCE能抵挡住android前进的脚步呢?       

android源码分析,下载

问题描述 android源码分析,下载 最近想学一下android的源码,一些组件的底层实现,有没有有关google android sdk分析的资源,到哪里可以下载? 解决方案 http://blog.csdn.net/liyuanjinglyj/article/details/48056357 下载方法 解决方案二: Android2.3 源码下载并分析android下载源码下载 android 4.0.3 源码 解决方案三: 搜 "老罗的android之旅",他也出了书,分析源码

Android Handler 原理分析及实例代码

Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使用的原因 1.多线程更新Ui会导致UI界面错乱 2.如果加锁会导致性能下降 3.只在主线程去更新UI,轮询处理 Handler使用简介 其实关键方法就2个一个sendMessage,用来接收消息 另一个是handleMessage,用来处理接收到的消息 下面是我参考疯狂android讲义,写的一个子

Android 重写ViewGroup 分析onMeasure()和onLayout()方法

Android 重写ViewGroup 分析onMeasure()和onLayout()方法 在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout. 1,在方法onMeasure中调用setMeasuredDimension方法 void android.view.View.setMeasuredDimension(int measuredWidth, int measuredHeight) 在onMeasure(int, int)中,必须调用setMeas

android emulator虚拟设备分析第一篇之battery

一.概述 本文使用的android版本是5.1.0_r1,goldfish内核版本是3.4,android镜像是x86架构的.本文以battery为例,完整地介绍了虚拟设备的实现和使用. 为什么android emulator需要虚拟设备,简单来说就是android系统需要使用,但是host系统却没有,比如gps,bluetooth,battery,gsm等.另外,虚拟设备也提供了android emulator和guest os之间交流的方式,比如emulator控制面板中可以设置电池的电量,