StatusBar分为两个部分:一是通常在手机界面最上端的未下拉的statusbar;二是下拉状态栏,也就是扩展状态栏。
通过在实际应用中,我们可以发现,statusbar就是一个activity,那么,它的使用自然少不了和service之间的交互。
PhoneStatusBar 通过IStatusBarService来访问StatusBarManagerService,而
StatusBarManagerService通过CommandQueue来和PhoneStatusBar进行交互。
一、StatusBar.java
通过class StatusBar的声明,我们可以看出,它或者其子类实现和StatusBarManagerService进行交互的CommandQueue的回调方法。
public abstract class StatusBar extends SystemUI implements CommandQueue.Callbacks {
public void start() {
View sb = makeStatusBarView();
//创建包括在config.xml中定义要在statusbar上显示的所有icons,那么它包含icons个数在何处初始化?
StatusBarIconList iconList = new StatusBarIconList();
//保存Notification是以Binder为key的
ArrayList<IBinder> notificationKeys = new ArrayList<IBinder>();
//保存在statusbar上显示的StatusBarNotification
ArrayList<StatusBarNotification> notifications = new ArrayList<StatusBarNotification>();
//和IStatusBarService进行交互的IBinder
mCommandQueue = new CommandQueue(this, iconList);
//获取StatusBarManagerService的本地实现
mBarService = IStatusBarService.Stub.asInterface(
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
int[] switches = new int[7];
ArrayList<IBinder> binders = new ArrayList<IBinder>();
try {
//这一步实际上就是将PhoneStatusBar的实现的CommandQueue其中包含
//callbacks传递给StatusbarManagerService使用
mBarService.registerStatusBar(mCommandQueue,
iconList, notificationKeys, notifications,
switches, binders);
} catch (RemoteException ex) {
// If the system process isn't there we're doomed anyway.
}
for (int i=0; i<N; i++) {
//这里第一次使用时icon仅仅是开辟一个存储空间,i代表的是数组的index,而viewIndex和i对应
StatusBarIcon icon = iconList.getIcon(i);
if (icon != null) {
addIcon①(iconList.getSlot(i), i, viewIndex, icon);
viewIndex++;
}
}
N = notificationKeys.size();
if (N == notifications.size()) {
for (int i=0; i<N; i++) {
addNotification②(notificationKeys.get(i), notifications.get(i));
}
} else {
}
//xml文件中定义的statusbar的height
final int height = getStatusBarHeight();
}
//这里将所有的状态栏上的view先初始化
WindowManagerImpl.getDefault().addView(sb, lp);
}