勤能补拙,熟能生巧,宁静致远

记录工作中的点滴积累,总结成长的步伐里程。

博客园 首页 新随笔 联系 订阅 管理
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文件中用代码设计的,不是普通的图片。



 

posted on 2017-11-21 17:23  ^-^antoon^-^  阅读(2609)  评论(0)    收藏  举报