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がイベントを処理することを提供します.