protected void makeStatusBarView() {
......
inflateStatusBarWindow(context);//加载布局的方法
......
}
protected void inflateStatusBarWindow(Context context) {
mStatusBarWindow = (StatusBarWindowView) View.inflate(context,
R.layout.super_status_bar, null);
}
......
protected void makeStatusBarView() {
......
// Set up the quick settings tile panel
View container = mStatusBarWindow.findViewById(R.id.qs_frame);//获取视图对象
......
final QSTileHost qsh = SystemUIFactory.getInstance().createQSTileHost(mContext, this,
mIconController);//创建并初始化QSTileHost对象
......
if (qs instanceof QSFragment) {
((QSFragment) qs).setHost(qsh);//给QSFragment(QSPanel)设置QSTileHost对象
mQSPanel = ((QSFragment) qs).getQsPanel();
}
......
}
QSTileHost.java
public QSTileHost(Context context, StatusBar statusBar,
StatusBarIconController iconController) {
mIconController = iconController;
mContext = context;
mStatusBar = statusBar;
......
Dependency.get(TunerService.class).addTunable(this, TILES_SETTING);//使用TunerService去Settings中查询key为TILES_SETTING的值,即查询快捷设置菜单项
......
}
TunerServiceImpl.java
private void addTunable(Tunable tunable, String key) {
......
Uri uri = Settings.Secure.getUriFor(key);
if (!mListeningUris.containsKey(uri)) {
mListeningUris.put(uri, key);
mContentResolver.registerContentObserver(uri, false, mObserver, mCurrentUser);
}
// Send the first state.
String value = Settings.Secure.getStringForUser(mContentResolver, key, mCurrentUser);
tunable.onTuningChanged(key, value);//查询到的结果通过onTuningChanged()方法回调返回
}
@Override
public void onTuningChanged(String key, String newValue) {
......
final List tileSpecs = loadTileSpecs(mContext, newValue);//调用loadTileSpecs方法将config.xml的内容load进来
......
tile = createTile(tileSpec);//在这里根据String生成Tile
......
newTiles.put(tileSpec,tile);
......
mTiles.putAll(newTiles);
......
for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).onTilesChanged();//这里回调onTilesChanged()方法,通知StatusBar.java对快捷设置选项显示更新
}
}
@Override
public void onTilesChanged() {
setTiles(mHost.getTiles());//该方法的作用下面会详细说明
}
QSFragment.java
public void setHost(QSTileHost qsh) {
mQSPanel.setHost(qsh, mQSCustomizer);//实质是将QSPanel和qsh绑定
}
QSPanel.java
public void setHost(QSTileHost host, QSCustomizer customizer) {
mHost = host;
mHost.addCallback(this);
setTiles(mHost.getTiles());
}
public void setTiles(Collection tiles, boolean collapsedView) {
for (TileRecord record : mRecords) {
mTileLayout.removeTile(record);
record.tile.removeCallback(record.callback);
}
mRecords.clear();
for (QSTile tile : tiles) {
addTile(tile, collapsedView);
}
}
protected TileRecord addTile(final QSTile tile, boolean collapsedView) {
final TileRecord r = new TileRecord();
r.tile = tile;
r.tileView = createTileView(tile, collapsedView);
final QSTile.Callback callback = new QSTile.Callback() {
@Override
public void onStateChanged(QSTile.State state) {
drawTile(r, state);
}
@Override
public void onShowDetail(boolean show) {
}
@Override
public void onToggleStateChanged(boolean state) {
}
@Override
public void onScanStateChanged(boolean state) {
}
@Override
public void onAnnouncementRequested(CharSequence announcement) {
}
};
r.tile.addCallback(callback);
r.callback = callback;
r.tileView.init(r.tile);
r.tile.refreshState();
mRecords.add(r);
if (mTileLayout != null) {
mTileLayout.addTile(r);//mTileLayout是layout视图对象
}
return r;
}
protected void setupTileLayout() {
mTileLayout = (QSTileLayout) LayoutInflater.from(mContext).inflate(
R.layout.qs_paged_tile_layout, this, false);
mTileLayout.setListening(mListening);
addView((View) mTileLayout);//把视图加入view
}