AnroidインフラストラクチャのView,Window,Activity
6243 ワード
1.PhoneWindow
DecorViewはPhoneWindowクラスに存在し、この2つのメンバー変数は包含関係に属し、mDecorはmContentParentを含む
private DecorView mDecor; private ViewGroup mContentParent;setContentViewはinstallDecorを呼び出し、installDecorはgenerateDecorを呼び出した後generateLayoutを呼び出し、上の2つの変数を生成します.
mDecorとLayout、LayoutにはmContentParentが含まれています
次のコードは、システムのデフォルトwindowのリソースファイルの名前と場所を証明し、frameworkに行って見つけることができます.
// Inflate the window decor.
int layoutResource;
int features = getLocalFeatures();
// System.out.println("Features: 0x" + Integer.toHexString(features));
if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) {
if (mIsFloating) {
layoutResource = com.android.internal.R.layout.dialog_title_icons;
} else {
layoutResource = com.android.internal.R.layout.screen_title_icons;
}
// System.out.println("Title Icons!");
} else if ((features & ((1 << FEATURE_PROGRESS) | (1 << FEATURE_INDETERMINATE_PROGRESS))) != 0) {
// Special case for a window with only a progress bar (and title).
// XXX Need to have a no-title version of embedded windows.
layoutResource = com.android.internal.R.layout.screen_progress;
// System.out.println("Progress!");
} else if ((features & (1 << FEATURE_CUSTOM_TITLE)) != 0) {
// Special case for a window with a custom title.
// If the window is floating, we need a dialog layout
if (mIsFloating) {
layoutResource = com.android.internal.R.layout.dialog_custom_title;
} else {
layoutResource = com.android.internal.R.layout.screen_custom_title;
}
} else if ((features & (1 << FEATURE_NO_TITLE)) == 0) {
// If no other features and not embedded, only need a title.
// If the window is floating, we need a dialog layout
if (mIsFloating) {
layoutResource = com.android.internal.R.layout.dialog_title;
} else {
layoutResource = com.android.internal.R.layout.screen_title;
}
// System.out.println("Title!");
} else {
// Embedded, so no decoration is needed.
layoutResource = com.android.internal.R.layout.screen_simple;
// System.out.println("Simple!");
}
mDecorにはmContentParentの他に、以下のViewがあります
private TextView mTitleView;
private ImageView mLeftIconView;
private ImageView mRightIconView;
private ProgressBar mCircularProgressBar;
private ProgressBar mHorizontalProgressBar;
ビューのほかにもう一つの背景があります
private Drawable mBackgroundDrawable;
他にもいくつかの特殊なものがあります
private DrawableFeatureState[] mDrawables; private PanelFeatureState[] mPanels; private PanelFeatureState mPreparedPanel;
これらは各種ダイアログボックスに対応しています
public static final int FEATURE_OPTIONS_PANEL = 0;
public static final int FEATURE_CONTEXT_MENU = 6;
PhoneWindowは自分の言葉で、いったい何ですか?
これらのすべてのものがWindowを構成しています.
Windowを定義できるようになりました.WindowはいくつかのViewの集合です.tileがあってDialogがあってcontentviewがあって、2つのiconがあって、背景があって、2つのProgressBarがあります
次のコードはActivity ThreadのhandleResumeActivityメソッドで
r.window = r.activity.getWindow();
View decor = r.window.getDecorView();
decor.setVisibility(View.INVISIBLE);
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams l = r.window.getAttributes();
a.mDecor = decor;
l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l);
}
PhoneWindowのdecorViewがWindowManagerにインストールされています.
次のコードでは、PhoneWindowがどのように作成した問題Activityのattachメソッドについて説明します.
興味深いことに、WindowはWindowManagerではなくPolicyManagerで作成されています.
mWindow = PolicyManager.makeNewWindow(this);
次のコードは、ActivityのsetContentViewメソッドです.
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mContentParent.addView(view, params);
final Callback cb = getCallback();
if (cb != null) {
cb.onContentChanged();
}
}
2.WindowManager:
ViewManagerに継承され、3つの重要な配列が含まれています.
private View[] mViews;
private ViewRoot[] mRoots;
private WindowManager.LayoutParams[] mParams;
配列の下付き文字に基づいてマッピングを行い,3つのMAPを構成した.
mRootsは実際にはhandlerであり、このhandlerはcallbackを通じてActivityにキーボードとマウスイベントを送信します.
WindowManagerImplは自分の言葉で言って、いったい何ですか.
WindowManagerImplは実際にはWindowを管理していません.WindowとWindowManagerServiceの会話を管理しています.mRootsはこれらの会話の縮図です.継承関係から見ると、View RootはViewではなく、Surfaceを含むView ParentのHandlerを実現しています.
ViewRootは本物の根です.
1.Surfaceを作成する
2.2つの会話を提供するIWindowとIWindowSession
3.Handlerがイベントを処理することを提供します.