Android Q 下拉状态栏快捷开关解析

Android 下拉状态栏快捷开关

快捷栏的创建在QSFactoryImpl.java中:
/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java

private QSTileImpl createTileInternal(String tileSpec) {
    // Stock tiles.
    switch (tileSpec) {
        case "wifi":
            return new WifiTile(mHost);
        case "bt":
            return new BluetoothTile(mHost);
        case "cell":
        ..........
    }

    // Intent tiles.
    if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(mHost, tileSpec);
    if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(mHost, tileSpec);

    // Debug tiles.
    if (Build.IS_DEBUGGABLE) {
        if (tileSpec.equals(GarbageMonitor.MemoryTile.TILE_SPEC)) {
            return new GarbageMonitor.MemoryTile(mHost);
        }
    }
    return null;
}

快捷栏 tile 的加载在 QSTileHost.java 的 loadTileSpecs 函数中,defaultTileList 是 tile 的顺序 ,在 quick_settings_tiles_default 中定义。
/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java

protected List<String> loadTileSpecs(Context context, String tileList) {
    final Resources res = context.getResources();
    final String defaultTileList = res.getString(R.string.quick_settings_tiles_default);
    if (tileList == null) {
        tileList = res.getString(R.string.quick_settings_tiles);
        if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList);
    } else {
        if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList);
    }
    final ArrayList<String> tiles = new ArrayList<String>();
    boolean addedDefault = false;
    for (String tile : tileList.split(",")) {
        tile = tile.trim();
        if (tile.isEmpty()) continue;
        if (tile.equals("default")) {
            if (!addedDefault) {
                tiles.addAll(Arrays.asList(defaultTileList.split(",")));
                addedDefault = true;
            }
        } else {
            tiles.add(tile);
        }
    }
    return tiles;
}

quick_settings_tiles_default 在这里定义:
/frameworks/base/packages/SystemUI/res/values/config.xml

<!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" -->
<string name="quick_settings_tiles_stock" translatable="false">
    wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotspot,inversion,saver,work,cast,night
</string>

每个 title 都写成了一个类,继承QSTileImpl.java
/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/
在这里插入图片描述
WifiTile 就是 wifi 的快捷键:
/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java

handleUpdateState wifi状态发生改变时调用

发布了67 篇原创文章 · 获赞 62 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43804080/article/details/103788048