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>

 

详细序列图如下:

相关文章
|
29天前
|
安全 Shell Android开发
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
53 0
|
29天前
|
安全 Android开发
Android13 Root实现和原理分析
Android13 Root实现和原理分析
149 0
|
29天前
|
Java Android开发
Android系统 获取用户最后操作时间回调实现和原理分析
Android系统 获取用户最后操作时间回调实现和原理分析
40 0
|
29天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
45 1
|
29天前
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
124 0
|
1天前
|
搜索推荐 安全 Android开发
安卓与iOS操作系统的对比分析
在移动设备市场上,安卓和iOS操作系统一直是主要竞争对手。本文将从用户界面、应用生态系统、定制化程度和安全性等方面对安卓和iOS进行对比分析,并探讨两者在不同场景下的适用性。
|
1天前
|
Java Android开发 iOS开发
深入探讨移动操作系统的性能优化:安卓与iOS的对比分析
在现代移动设备中,操作系统的性能优化至关重要。本文从系统架构、内存管理、电池续航和应用程序运行效率等多个维度,深入探讨了安卓(Android)和iOS两大主流移动操作系统的优化策略及其实际效果,旨在为开发者和用户提供更清晰的了解和选择依据。
11 0
|
7天前
|
安全 Android开发 iOS开发
安卓与iOS操作系统的比较分析
【6月更文挑战第5天】本文将深入探讨安卓和iOS两大主流操作系统的特点、优势和劣势。通过对比分析,我们将揭示这两个系统在性能、安全性、用户体验等方面的差异,帮助用户更好地了解这两个系统,从而做出更明智的选择。
|
15天前
|
人工智能 vr&ar Android开发
安卓与iOS系统的发展趋势及影响分析
在移动互联网时代,安卓和iOS作为两大主流移动操作系统,在不断发展变化中展现出不同的特点和发展趋势。本文从技术性角度出发,分析了安卓和iOS系统的发展趋势,并探讨了它们对移动设备市场和用户体验的影响,帮助读者更好地理解当前移动操作系统的发展方向和未来可能的变化。
16 0
|
28天前
|
Java Linux 调度
Android 打包分析
Android 打包分析
24 2