(SystemUI)状态栏系统图标加载与更新


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文件中用代码设计的,不是普通的图片。



 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM