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