Android系统应用---SystemUI之二:Statusbar显示流程以及系统状态图标更新分析

本文详细介绍了Android系统状态栏(StatusBar)的构成和工作原理,包括通知图标、状态图标区域、信号电量显示以及时钟区域。关键类包括BaseStatusBar、PhoneStatusBar和PhoneStatusBarPolicy。系统图标状态更新通过BroadcastReceiver监听,例如AudioManager、BluetoothAdapter等状态变化。StatusBarManagerService作为SystemUI与SystemServer间的桥梁,维护图标状态并确保意外退出后的恢复。定制开发流程涉及修改config文件、添加预定义意图、监听广播事件以及在StatusBarPolicy中绑定资源图标。

StatusBar概述

状态栏主要用来显示一些系统图标,应用的通知图标和系统时间。Statusbar模块就是控制和管理着这些图标,以及通知信息的显示和一些系统开关的。状态栏在Android手机中位于屏幕的最上方,通常在各种应用的最上方都会显示。

当SystemUI和Status Bar创建完成,就通过makeStatusBarView()进行布局的加载和界面的显示。

状态栏的视图效果如下图:


如图所示,状态栏分为通知图标区域,状态图标区域,信号电量组合区域和时钟区域

●通知区域显示系统发出notification的ticker,有图标和文字的简短显示

●状态图标区域显示系统设备的当前状态,例如打开了WIFI,蓝牙,GPS后,此区域都会显示相对应的图标。上图是打开的静音和闹钟图标。

●信号组合区域显示信号变化状态,当信号发生变化后此处图标都会进行相应更新。

●电量显示区域显示电量的变化状态

●时钟区域按指定格式显示系统的当前时间。

StatusBar 实现原理:

 

               

 

从类图中我们可以看到几个重要的类和方法

BaseStatusBar:状态栏核心类,是一个抽象类,它的start方法定义了状态栏启动时的具体步骤,负责绑定远程代理接口以及管理窗口。

PhoneStatusBar:手机状态栏的具体实现类

PhoneStatusBarPolicy:定义了系统通知图标的设置策略,监听图标改变广播

CommandQueue:继承自IStatusBar.stub远程接口,继承自IStatusBar.Stub,是IStatusBar的服务端,是IStatusBarService与BaseStatusBar进行通信的桥梁。

 

实现的关键步骤:

1.      获取StatusBarManagerService 的实例,获取一端连接

StatusBarManagerService是运行于SystemServer的一个系统服务。并由ServiceManager管理,它比StatusBar创建的早,继承IStatusBarService.Stub,它接受用户操作状态栏的请求并将其转发给BaseStatusBar。为了保证SystemUI 意外退出后不会发生信息丢失,保存了所有需要状态栏与导航栏进行显示或处理的信息副本。StatusBarManagerService 为那些对状态栏感兴趣的其他系统服务定义了一系列接口,对SystemUI而言,它是一个客户端,因为framework收到请求后,StatusBarManagerService 会将用户操作状态栏的请求发送给SystemUI,并由后者完成响应 。

 

        mBarService = IStatusBarService.Stub.asInterface(

               ServiceManager.getService(Context.STATUS_BAR_SERVICE));

 

2.将一个继承自IStatusBar.Stub的CommandQueue的实例注册到IStatusBarService以建立通信,并将信息副本取回,实现双向连接。registerStatusBar()保存BaseStatusBar中的CommandQueue的Bp端到mBar成员之中,然后再把信息副本填充到参数里去。StatusBarManagerService将通过mBar与BaseStatusBar进行通信。

        mCommandQueue = new CommandQueue(this, iconList);

        try {

            mBarService.registerStatusBar(mCommandQueue,iconList, notificationKeys, notifications,

                    switches, binders);

        } catch (RemoteException ex) {

            // If the system process isn't there we're doomedanyway.

        }

 

  3.通过调用子类PhoneStatusBar的createAndAddWindows()方法完成状态栏与导航栏的控件树及窗口的创建与显示。

 


系统图标状态更新



StatusBar中,通知图标不受限制,发送通知即可显示,信号和电池以及时间图标相对独立,本文主要介绍系统状态区图标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值