歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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進行交互的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);

}

Copyright © Linux教程網 All Rights Reserved