以网格快捷设置栏为例,在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判断去掉,让手机把默认值改了后再改回来就行了。