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);
}