歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android 4.0 statusbar加載icon

Android 4.0 statusbar加載icon

日期:2017/3/1 10:18:46   编辑:Linux編程

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