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是以Binderkey

        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,而viewIndexi对应

       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文件中定义的statusbarheight

final int height = getStatusBarHeight();

}

//这里将所有的状态栏上的view先初始化

WindowManagerImpl.getDefault().addView(sb, lp);

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pszyp.html