com.android.systemui.statusbar.
BaseStatusBar中onstart()方法
mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); …… StatusBarIconList iconList = new StatusBarIconList(); mCommandQueue = new CommandQueue(this, iconList); int[] switches = new int[8]; ArrayList<IBinder> binders = new ArrayList<IBinder>(); try { mBarService.registerStatusBar(mCommandQueue, iconList, switches, binders);//这里初始化iconList数据。 } catch (RemoteException ex) { // If the system process isn't there we're doomed anyway. }
com.android.server.statusbar.
public class StatusBarManagerService extends IStatusBarService.Stub
public StatusBarManagerService(Context context, WindowManagerService windowManager) { mContext = context; mWindowManager = windowManager; final Resources res = context.getResources(); mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons));//这里设定了系统图标对应的字符串 LocalServices.addService(StatusBarManagerInternal.class, mInternalService); }
StatusBarIconList.java public void defineSlots(String[] slots) { final int N = slots.length; String[] s = mSlots = new String[N]; for (int i=0; i<N; i++) { s[i] = slots[i]; } mIcons = new StatusBarIcon[N]; }
PhoneStatusBarPolicy中的start()方法会实例化PhoneStatusBarPolicy,PhoneStatusBarPolicy的构造函数中通过mService.setIcon()初始化系统图标
public PhoneStatusBarPolicy(Context context, CastController cast, HotspotController hotspot) { mContext = context; mCast = cast; mHotspot = hotspot; mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE); // listen for broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED); filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED); filter.addAction(Intent.ACTION_USER_SWITCHED); mContext.registerReceiver(mIntentReceiver, filter, null, mHandler); int numPhones = TelephonyManager.getDefault().getPhoneCount(); mSimState = new IccCardConstants.State[numPhones]; for (int i = 0; i < numPhones; i++) { mSimState[i] = IccCardConstants.State.READY; } // TTY status mService.setIcon(SLOT_TTY, R.drawable.stat_sys_tty_mode, 0, null); mService.setIconVisibility(SLOT_TTY, false); // Cdma Roaming Indicator, ERI mService.setIcon(SLOT_CDMA_ERI, R.drawable.stat_sys_roaming_cdma_0, 0, null); mService.setIconVisibility(SLOT_CDMA_ERI, false); // bluetooth status updateBluetooth(); // Alarm clock mService.setIcon(SLOT_ALARM_CLOCK, R.drawable.stat_sys_alarm, 0, null); mService.setIconVisibility(SLOT_ALARM_CLOCK, false); // Sync state mService.setIcon(SLOT_SYNC_ACTIVE, R.drawable.stat_sys_sync, 0, null); mService.setIconVisibility(SLOT_SYNC_ACTIVE, false); // "sync_failing" is obsolete: b/1297963 // zen mService.setIcon(SLOT_ZEN, R.drawable.stat_sys_zen_important, 0, null); mService.setIconVisibility(SLOT_ZEN, false); // volume mService.setIcon(SLOT_VOLUME, R.drawable.stat_sys_ringer_vibrate, 0, null); mService.setIconVisibility(SLOT_VOLUME, false); updateVolumeZen(); if (mContext.getResources().getBoolean(R.bool.config_showSdcardAbsentIndicator)) { mStorageManager = (StorageManager) context .getSystemService(Context.STORAGE_SERVICE); mService.setIcon("sdcard_absent", R.drawable.stat_sys_no_sdcard, 0, null); mService.setIconVisibility("sdcard_absent", !isSdCardInsert(mContext)); StorageEventListener listener = new StorageEventListener() { public void onStorageStateChanged(final String path, final String oldState, final String newState) { updateSDCardtoAbsent(); } }; mStorageManager.registerListener(listener); } // cast mService.setIcon(SLOT_CAST, R.drawable.stat_sys_cast, 0, null); mService.setIconVisibility(SLOT_CAST, false); mCast.addCallback(mCastCallback); mAlarmIconObserver.onChange(true); mContext.getContentResolver().registerContentObserver( Settings.System.getUriFor(Settings.System.SHOW_ALARM_ICON), false, mAlarmIconObserver); // hotspot if (!mContext.getResources().getBoolean( com.android.internal.R.bool .config_regional_hotspot_show_notification_when_turn_on)) { mService.setIcon(SLOT_HOTSPOT, R.drawable.stat_sys_hotspot, 0, null); mService.setIconVisibility(SLOT_HOTSPOT, mHotspot.isHotspotEnabled()); mHotspot.addCallback(mHotspotCallback); } }
com.android.systemui.statusbar.phone.
PhoneStatusBarPolicy处理系统图标更新。PhoneStatusBarPolicy中注册了BroadcastReceiver接收系统状态变化,进而更新对应图标。
以静音图标为例:
接收广播 AudioManager.RINGER_MODE_CHANGED_ACTION
updateVolumeZen()方法中
if (DndTile.isVisible(mContext) && !DndTile.isCombinedIcon(mContext) && audioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT) { volumeVisible = true; volumeIconId = R.drawable.stat_sys_ringer_silent;//静音图标在状态栏显示 volumeDescription = mContext.getString(R.string.accessibility_ringer_silent); }
PS: 系统图标都是在xml文件中用代码设计的,不是普通的图片。