Android発見の旅のViewRootImpl,Activity,Window,DecorViewの関係

2038 ワード

Androidの複雑な概念は、よく人をめまいがして転向させる.本編ではuiのいくつかの概念の関係について述べる.
1.activity起動プロセスから各オブジェクトの関係がわかる
これはandroid uiの核心概念であることはよく知られています.インタフェースのアクティブなインタフェースです.startActivity方式で起動する.中間状態を省く:
Activityのattachインタフェースで:
5063         mWindow = PolicyManager.makeNewWindow(this);   activity   Window  .
  5064         mWindow.setCallback(this);    window      activity

  5087         mWindow.setWindowManager(     window   manager
  5088                 (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
  5089                 mToken, mComponent.flattenToString(),
  5090                 (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
  5091         if (mParent != null) {
  5092             mWindow.setContainer(mParent.getWindow());
  5093         }
  5094         mWindowManager = mWindow.getWindowManager();   windowmanager

Activity ThreadのhandleResumeActivityインタフェースでは、
  2796                 r.window = r.activity.getWindow();
  2797                 View decor = r.window.getDecorView(); decorview window  ,   window   
  2798                 decor.setVisibility(View.INVISIBLE);
  2799                 ViewManager wm = a.getWindowManager();
  2800                 WindowManager.LayoutParams l = r.window.getAttributes();
  2801                 a.mDecor = decor;   activity mDecor             

  2804                 if (a.mVisibleFromClient) {
  2805                     a.mWindowAdded = true;
  2806                     wm.addView(decor, l);          WindowManagerGlobal addView
  2807                 }

WindowManagerGlobalのaddView会
16             root = new ViewRootImpl(view.getContext(), display);
6              root.setView(view, wparams, panelParentView);

つまり、ViewRootImplのmViewは実はDecorViewです.
2.まとめ
各activityにはwindowがあり、windowはwindowmanagerによって管理されている.
各ウィンドウにdecorviewがあります.
ウィンドウごとに
描画開始はViewRoot.
イベントの発信元
転送canvasを描画します.canvasはsurfaceから来ます.