Android Q 下拉状态栏快捷开关解析
16lz
2021-01-23
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状态发生改变时调用
关注公众号,获取更多开发必备知识
更多相关文章
- Switch自定义
- Android onMeasure自定义
- 不使用布局文件,代码中自定义界面
- Android定义宽高比控件
- 【Android】自定义权限
- Android高手进阶教程(三)之----Android 中自定义View的应用.
- 自定义menu替代TabHost中的TabWidget
- Android自定义dialog以及如何去除黑色背景