android4.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.asInte易做图ce(
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);
}
二、PhoneStatusBar.java
public class PhoneStatusBar extends StatusBar {
}
PhoneStatusBar 是StatusBar(extends SystemUI)的子类,真正和StatusBarManagerService交互的实际上就是它。
对于SystemUI,首先启动的是Start();
public void start() {
……
//调用StatusBar 的start方法,建立和StatusbarManagerService之间的联系
super.start();//在StatusBar的start中实现makeStatusBarView然后初始化statusbar icon状态
//启动更新Icon的方法
mIconPolicy = new PhoneStatusBarPolicy(mContext);
}
super.start()中我们看到,StatusBar是一个abstract类,真正要建立View是不能够的,必须在子类中创建。
实际上,StatusBar中也这样定义protected abstract View makeStatusBarView()
PhoneStatusBar 中:
protected View makeStatusBarView() {
final Context context = mContext;
Resources res = context.getResources();
//定义Icon的大小,缩放率和彼此间距
loadDimens();
mIconSize =
res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size);
//状态栏下拉时的view
ExpandedView expanded = (ExpandedView)View.inflate(context,
R.layout.status_bar_expanded, null);
//真正显示的statusbar是根据是否是双卡来选择xml文件
PhoneStatusBarView sb;
if (TelephonyManager.getDefault().isMultiSimEnabled()) {
sb = (PhoneStatusBarView)View.inflate(context,
R.layout.msim_status_bar, null);
} else {
sb = (PhoneStatusBarView)View.inflate(context,
R.layout.status_bar, null);
}
//获取statusbar的实例
sb.mService = this;
mStatusBarView = sb;
//显示statusbar icon的view
mStatusIcons = (LinearLayout)sb.findViewById(R.id.statusIcons);
//显示notification的view
mNotificationIcons = (IconMerger)sb.findViewById(R.id.notificationIcons);
mMoreIcon = sb.findViewById(R.id.moreIcon);
//定义下拉状态栏,显示Notifications
mExpandedDialog = new ExpandedDialog(context);
/*这个expanded就是指layout下的status_bar_expanded.xml解析所得下拉状态栏*/
mExpandedView = expanded;
//显示Notification的控件,NotificationRowLayout是处理函数,
mPile = (NotificationRowLayout)expanded.findViewById(R.id.latestItems);
mExpandedContents = mPile; // was: expanded.findViewById(R.id.notificationLinearLayout);
//android2.3中显示onGoing等信息的textview,android4.0已经不用了
mNoNotificationsTitle = (TextView)expanded.findViewById(R.id.noNotificationsTitle);
mNoNotificationsTitle.setVisibility(View.GONE);
……
}
在步骤一的函数start()中的标识①处调用的是PhoneStatusBar的函数,在那里初始化status bar icon,
前面说了,在registerStatusBar时获得的iconList是没有icon的
public void addIcon(String slot, int index, int viewIndex, StatusBarIcon icon) {
//依据config.xml中的config_statusBarIcons定义的字符串创建StatusBarIconView,注意
//mContext是PhoneStatusBar的mContext
StatusBarIconView view = new StatusBarIconView(mContext, slot, null);
//设置显示的icon
view.set(icon);<
补充:移动开发 , Android ,