AndroidのActivity、Window、Viewの関係

3361 ワード

IDEを開いてActivityを作成すると、IDEは自動的にコードを生成し、空のActivityインタフェースが表示されます.このプロセスには、Activity Window Viewの関係が含まれています.このプロセスでは、Activityはモデル全体の制御ユニットであり、Windowはベアラモデルに属し、ベアラビューを担当し、Viewはビュー表示モデルです.
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     }   
    }

Activityの起動プロセスは複雑で、最終的にはActivity ThreadのperformLaunchActivity()によって完了する起動プロセス全体であり、このメソッドの内部でクラスローダによってActivityのインスタンスオブジェクトが作成され、そのattachメソッドが関連運転中に依存するコンテキスト環境変数の一連を呼び出す.Activityのattachメソッドでは、Activityが属するWindowオブジェクトを作成し、コールバックインタフェースを設定します.Windowオブジェクトの作成はPolicyManagerのmakeNewWindowメソッドで実現されます.AvtivityはWindowのCallbackインタフェースを実現しているため、Windowが外部の状態変化を受信するとActivityの方法にコールバックする.
ViewはAndroidでのビュー表示方式ですが、Viewは単独では存在せず、Windowという抽象的な概念に付着しなければならないので、試みがあればWindowがあります.
Androidでビューを提供できる場所にはActivity Dialog Toastがあり、PopupWindow MenuのようなWindowに頼って実現されるビューもあります.これらもビューで、ビューがあればWindowがあるので、Activity Dialog ToastなどはWindowに対応しています.
ではWindowとViewの絆は?
ViewRootはViewRootImplクラスに対応しており、WindowManagerとDecorviewを接続する絆であり、Viewの3つのプロセス(measure,layout,draw)はすべてViewRootによって完成している.Activity Threadでは、Activityオブジェクトが作成されると、WindowにDecorViewが追加され、ViewRootImplオブジェクトが作成され、ViewRootImplオブジェクトとDecorViewが関連付けられます.
root=new ViewRootImpl(view.getContext),display);
root.setView(view,wparams,panelParentView);
Viewの描画プロセスは、ViewRootのperformTraversalsメソッドから始まり、measure、layout、drawの3つのプロセスを経て最終的にViewを描画します.measureはViewの幅を測定し、layoutは親コンテナにおけるViewの配置位置を決定し、drawはViewをスクリーンに描画します.このように1本のViewツリーの遍歴を繰り返すと、Viewビュー全体が画面に表示されます.
onCreat()では、1つのsetContentView()の操作しかありません.ActivityのsetContentViewの実装では、Activityが具体的な実装をWindow処理に渡し、Windowの具体的な実装はPhoneWindowがsetContentにDecorViewを作成し、DecorViewはViewツリー全体のトップレベルのViewであり、DecorViewをDecorViewのmContentParentに追加します.最後にActivityをコールバックするonContntChangesメソッドは、Activityビューが変更されたことを通知します.
DecorViewはトップレベルのViewとして、一般的にその内部には垂直方向のLinearLayoutが含まれています.このLinearLayoutには上下2つの部分があり、上はタイトルバーで、下は内容バーで、タイトルバーは一般的にActivityのThemeスタイルによって決まります.ActivityでsetContentViewで設定したレイアウトファイルは、実際にはコンテンツバーに追加されます.
1つの比喩は、Activity Window Viewの3つの関係をまとめます.Activityは職人(制御ユニット)、Window像窓(荷重モデル)、View像窓花(表示ビュー).
ActivityはonCreateの前にattachメソッドを呼び出し、attachメソッドでwindowオブジェクトを作成します.Windowsオブジェクトの作成時にDecorオブジェクトを作成します.ユーザーがActivityでsetContentViewを呼び出し、windowのsetContentViewを呼び出すと、DecorViewが存在するかどうかをチェックし、存在しない場合はDecorViewオブジェクトを作成し、ユーザー自身のViewをDecorViewに追加します.