首页 / 操作系统 / Linux / Android 4.0 statusbar加载icon
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进行交互的IBindermCommandQueue = 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的heightfinal int height = getStatusBarHeight();}//这里将所有的状态栏上的view先初始化WindowManagerImpl.getDefault().addView(sb, lp);}