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状态发生改变时调用