Status bar是launcher主界面上面提示当前状态(电池,网络,蓝牙等等)的一个栏。
本文以它的功能为框架进行分析(android 2.2)。
一. 功能概述
1. Status icon显示
2. Notification(比如有短信时,会在上面提示)
二. 主要涉及文件
主体文件在frameworks/base/services/java/com/android/server/status下
三. 主要功能描述
system server启动时,new 一个statusbarService,并在service manager中注册。
statusbarservice继承自Istatusbar,其主要methods为
interface IStatusBar
{
void activate();
void deactivate();
void toggle();
void disable(int what, IBinder token, String pkg);
IBinder addIcon(String slot, String iconPackage, int iconId, int iconLevel);
void updateIcon(IBinder key, String slot, String iconPackage, int iconId, int iconLevel);
void removeIcon(IBinder key);
}
而客户端则借助于statusbarmanager(frameworks/base/core/java/android/app)对statusbar进行访问。不过statusbarmanger没有继承自Istatusbar,其实现的methods为
disable, collapse(实际为service中的deactivate), expand(实际是service中的activate), toggle,addicon, updateicon, removeicon。所以statusbarmanager确实完成了一般的proxy的任务
有几篇文章写得不错
http://blog.csdn.net/stonecao/article/details/6642727
------------------------------------------------------------------以下是2.35版本上的分析-------------------------------------------------------
2.3.5与2.2的status bar差别巨大,新加了很多东西。
有两个interface,分别为Istatusbar和IstatusbarService。 Systemserver会首先new一个继承自Istatusbarservice.stub的statusbarManagerService,这个东东在systemready2中会启动statusbarservice。而statusbarservice会向statusbarmanagerservice注册它自身,这样manager就能用到其功能。statusbarservice继承于service,因此会有onCreate, onBind等等service特性,并且实现了Commandqueue.callbacks。而它自身又持有commandqueue实例,commandqueue其实又继承Istatusbar.stub 。。。是不是晕了。。。有好心人画张关系图给我哈,懒得搞了。。。
在statusbarservice的oncreate中,有makeStatusbarView生成整个statusbar框架,最后调用new statusbarpolicy进行初始icon的绘制。
首先会通过context.getSystemService(在contextimpl中实现)new一个statusbarmanager实例(又一个新名字。。。我只能说,shit,谷歌你命名太乱了),这个东东其实就是给statusbarmanagerservice包了一层(在new时通过servicemanager获得binder,并asInterface)
可以显示的图标定义: frameworks/base/core/res/res/values/config.xml
status bar的高度字体:frameworks/base/core/res/res/values/dimens.xml
待续