SystemUI新增快捷方式

以网格快捷设置栏为例,在makeStatusBarView()方法中

                mQS = new QuickSettingsController(mContext, mSettingsContainer, this,
                        Settings.System.QUICK_SETTINGS_TILES, false);


如上第4个参数是从Settings.System中取条目的key值,第5个参数决定是哪种模式的快捷设置。QuickSettingsController控制了整个设置的加载,其主要方法

    protected void setupQuickSettings() {
        shutdown();
        mReceiver = new QSBroadcastReceiver();
        mReceiverMap.clear();
        mObserver = new QuickSettingsObserver(mHandler);
        mObserverMap.clear();
        mTileStatusUris.clear();
        loadTiles();
        setupBroadcastReceiver();
        setupContentObserver();
        if (mRibbonMode) {
            for (QuickSettingsTile t : mQuickSettingsTiles) {
                t.switchToRibbonMode();
            }
        }
    }

loadTiles()加载条目

        String tiles = Settings.System.getStringForUser(resolver,
                mSettingsKey, UserHandle.USER_CURRENT);
        if (tiles == null) {
            Log.i(TAG, "Default tiles being loaded");
            tiles = TextUtils.join(TILE_DELIMITER, TILES_DEFAULT);
        }

初始条目由Setting应用中进行设置,默认是QSConstants的静态对象。

对于每个Tile,在构造后都进行了初始化

        for (String tile : tiles.split("\\|")) {
            QuickSettingsTile qs = null;
            if (tile.equals(TILE_BLUETOOTH)) {
               qs = new BluetoothTile(mContext, this, mStatusBarService.mBluetoothController);

            } else if (tile.equals(TILE_AUTOROTATE)) {
                qs = new AutoRotateTile(mContext, this, mHandler);
            } else if (tile.equals(TILE_AIRPLANE)) {
                qs = new AirplaneModeTile(mContext, this, mStatusBarService.mNetworkController);
            } else if (tile.equals(TILE_GPS)) {
                qs = new GPSTile(mContext, this);
            } else if (tile.equals(TILE_MOBILEDATA) && mobileDataSupported) {
                qs = new MobileNetworkTile(mContext, this, mStatusBarService.mNetworkController);
            } else if (tile.equals(TILE_WIFI)) {
                qs = new WiFiTile(mContext, this, mStatusBarService.mNetworkController);
            } else if (tile.equals(TILE_RINGER)) {
                qs = new RingerModeTile(mContext, this);
            } else if (tile.equals(TILE_TORCH)) {
            	qs = new TorchTile(mContext,this);
            }

            if (qs != null) {
                qs.setupQuickSettingsTile(inflater, mContainerView);
                mQuickSettingsTiles.add(qs);
            }
        }

setupBroadcastReceiver()方法为注册监听广播,当收到广播时对所有Tile都调用了onReceive方法进行更新。

如何新增一个Tile?

1、在QSConstants中增加一条对应的String,并且在static方法中add你要增加的。

2、在com.android.systemui.quicksettings内新建一个类继承QuickSettingsTile并实现方法。

3、在QuickSettingsController的loadTiles()方法中for循环内的if判断中增加你要新增的。

4、在Setting App中的QuickSettingsUtil.java中static中register你新增的条目对应的名称以及图标。

主要,由于值是保存在全局数据库内,所以修改后是看不到结果的,如果要看结果,方法一:重新刷版本。方法二:让手机从默认设置中读取值

    public static String getCurrentTiles(Context context, boolean isRibbon) {
        String tiles = Settings.System.getString(context.getContentResolver(),
                isRibbon ? Settings.System.QUICK_SETTINGS_RIBBON_TILES
                         : Settings.System.QUICK_SETTINGS_TILES);
        if (tiles == null) {
            tiles = getDefaultTiles(context);
        }
        return tiles;
    }


比如把上面这个方法内的if判断去掉,让手机把默认值改了后再改回来就行了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值