Android Viewのライフサイクル

80680 ワード

Activityのライフサイクルはご存知ですが、viewのライフサイクルは?一般的なonMeasure、onLayout、onDrawを除いて、これらとActivityのonCreate、onStart、onResumeの実行順は何ですか?Viewのライフサイクルは、構築方法から順に次の方法を実行します.このVisibilityがデフォルトの場合:
一、ライフサイクル方法
(0)Constructors()
Viewはコードで作成されたときに第1のコンストラクションメソッドを呼び出し、Viewがlayoutからロードされたときに第2のコンストラクションメソッドを呼び出し、XMLのプロパティも解析されます.
(1)onFinishInflate()
このメソッドは、XMLファイルからのViewおよびそのサブViewのロードが完了すると呼び出しをトリガーします.通常はActivityのonCreateメソッド呼び出し後に呼び出されます.
(2)onAttachedToWindow()
ビューがウィンドウにアタッチされるとトリガーされます.ActivityがonResumeメソッドを初めて実行した後に呼び出されます.(3)onWindowVisibilityChanged()
現在のViewを含むWindowの可視性が変更されたときに呼び出されます.
(4)onVisibilityChanged()
このメソッドは、現在のViewまたはその祖先の可視性が変更されたときに呼び出されます.ビューステータスが表示されない場合、またはGONEの場合、このメソッドは最初に呼び出されます.
(5)onMeasure()
このメソッドは、ViewおよびそのサブViewサイズのサイズを決定するときに呼び出されます.
(6)onSizeChanged()
このメソッドはMeasureメソッドの後であり,測定サイズが以前と異なる場合に呼び出される.
(7)onLayout()
このメソッドは、現在のViewがそのサブViewに寸法と位置を割り当てる必要がある場合に呼び出されます.
(8)onDraw(Canvas)
この方法は、Viewレンダリングコンテンツの詳細に使用します.
(9)onWindowFocusChanged()
この方法は、現在のビューを含むWindowがフォーカスを取得または失ったときに呼び出されるように、ペイント中に呼び出されることもあります.コードで定義されたViewのいくつかのLayoutParameterを設定できます.
Viewが破棄フェーズに入った場合、呼び出されるに違いありません.
(10)onDetachedFromWindow()
ビューがアタッチされたウィンドウから離れるとトリガーされます.たとえば、ActivityがonDestroyメソッドを呼び出すと、ビューはウィンドウから離れます.最初のAttachedToWindowとは対照的に、一度だけ呼び出されます.コードは次のとおりです.
package com.example.testviewlifecycle;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class CustomView extends View {
    private static final String TAG = "CustomView=-->";
    private Paint mPaint;


    public CustomView(Context context) {
        super(context);
        Log.d(TAG, "view Constructors 1");
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
        Log.d(TAG, "view Constructors 2");
    }

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Log.d(TAG, "view Constructors 3");
    }

    private void init() {
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
        mPaint.setTextAlign(Paint.Align.CENTER);
        mPaint.setAntiAlias(true);
        mPaint.setTextSize(36);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        Log.d(TAG, "onFinishInflate");
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        Log.d(TAG, "onVisibilityChanged");
    }

    @Override
    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
        Log.d(TAG, "onFocusChanged");
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        Log.d(TAG, "onAttachedToWindow");
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        Log.d(TAG, "onDetachedFromWindow");
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.d(TAG, "onMeasure");
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        Log.d(TAG, "onLayout");
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Log.d(TAG, "onDraw");
        canvas.drawText("view    ", 100, 400, mPaint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        Log.d(TAG, "onSizeChanged");
    }

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        Log.d(TAG, "onWindowFocusChanged");
    }

    @Override
    protected void onWindowVisibilityChanged(int visibility) {
        super.onWindowVisibilityChanged(visibility);
        Log.d(TAG, "onWindowVisibilityChanged");
    }
}


ここでデフォルトのcustomViewはvisibleであり、Activityのライフサイクル結果は以下の1)、android:visibility=「visible」作成プロセス
2020-03-10 14:38:06.542 7961-7961/com.example.testviewlifecycle D/MainActivity=-->: onCreate 1
2020-03-10 14:38:06.564 7961-7961/com.example.testviewlifecycle D/CustomView=-->: view Constructors 2
2020-03-10 14:38:06.564 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onFinishInflate
2020-03-10 14:38:06.566 7961-7961/com.example.testviewlifecycle D/MainActivity=-->: onCreate 2
2020-03-10 14:38:06.569 7961-7961/com.example.testviewlifecycle D/MainActivity=-->: onStart
2020-03-10 14:38:06.572 7961-7961/com.example.testviewlifecycle D/MainActivity=-->: onResume
2020-03-10 14:38:06.589 7961-7961/com.example.testviewlifecycle D/MainActivity=-->: onAttachedToWindow
2020-03-10 14:38:06.590 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onAttachedToWindow
2020-03-10 14:38:06.590 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onWindowVisibilityChanged
2020-03-10 14:38:06.590 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onVisibilityChanged
2020-03-10 14:38:06.593 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onMeasure
2020-03-10 14:38:06.594 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onMeasure
2020-03-10 14:38:06.606 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onMeasure
2020-03-10 14:38:06.606 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onMeasure
2020-03-10 14:38:06.606 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onSizeChanged
2020-03-10 14:38:06.606 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onLayout
2020-03-10 14:38:06.608 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onDraw
2020-03-10 14:38:06.621 7961-7961/com.example.testviewlifecycle D/CustomView=-->: onWindowFocusChanged


破棄プロセス
2020-03-10 14:41:24.684 9188-9188/com.example.testviewlifecycle D/MainActivity=-->: onPause
2020-03-10 14:41:24.694 9188-9188/com.example.testviewlifecycle D/CustomView=-->: onWindowFocusChanged
2020-03-10 14:41:25.237 9188-9188/com.example.testviewlifecycle D/CustomView=-->: onWindowVisibilityChanged
2020-03-10 14:41:25.252 9188-9188/com.example.testviewlifecycle D/MainActivity=-->: onStop
2020-03-10 14:41:25.255 9188-9188/com.example.testviewlifecycle D/CustomView=-->: onVisibilityChanged
2020-03-10 14:41:25.258 9188-9188/com.example.testviewlifecycle D/MainActivity=-->: onDestroy
2020-03-10 14:41:25.259 9188-9188/com.example.testviewlifecycle D/CustomView=-->: onDetachedFromWindow
2020-03-10 14:41:25.260 9188-9188/com.example.testviewlifecycle D/MainActivity=-->: onDetachedFromWindow

2)、**android:visibility="invisible"**非表示の場合に作成
2020-03-10 14:42:54.333 9649-9649/? D/MainActivity=-->: onCreate 1
2020-03-10 14:42:54.404 9649-9649/? D/CustomView=-->: view Constructors 2
2020-03-10 14:42:54.404 9649-9649/? D/CustomView=-->: onFinishInflate
2020-03-10 14:42:54.413 9649-9649/? D/MainActivity=-->: onCreate 2
2020-03-10 14:42:54.417 9649-9649/? D/MainActivity=-->: onStart
2020-03-10 14:42:54.422 9649-9649/? D/MainActivity=-->: onResume
2020-03-10 14:42:54.480 9649-9649/? D/MainActivity=-->: onAttachedToWindow
2020-03-10 14:42:54.480 9649-9649/? D/CustomView=-->: onAttachedToWindow
2020-03-10 14:42:54.480 9649-9649/? D/CustomView=-->: onWindowVisibilityChanged
2020-03-10 14:42:54.480 9649-9649/? D/CustomView=-->: onVisibilityChanged
2020-03-10 14:42:54.488 9649-9649/? D/CustomView=-->: onMeasure
2020-03-10 14:42:54.489 9649-9649/? D/CustomView=-->: onMeasure
2020-03-10 14:42:54.511 9649-9649/? D/CustomView=-->: onMeasure
2020-03-10 14:42:54.511 9649-9649/? D/CustomView=-->: onMeasure
2020-03-10 14:42:54.511 9649-9649/? D/CustomView=-->: onSizeChanged
2020-03-10 14:42:54.511 9649-9649/? D/CustomView=-->: onLayout
2020-03-10 14:42:54.638 9649-9649/? D/CustomView=-->: onWindowFocusChanged

破棄
2020-03-10 14:43:50.009 9649-9649/com.example.testviewlifecycle D/MainActivity=-->: onPause
2020-03-10 14:43:50.019 9649-9649/com.example.testviewlifecycle D/CustomView=-->: onWindowFocusChanged
2020-03-10 14:43:50.557 9649-9649/com.example.testviewlifecycle D/CustomView=-->: onWindowVisibilityChanged
2020-03-10 14:43:50.578 9649-9649/com.example.testviewlifecycle D/MainActivity=-->: onStop
2020-03-10 14:43:50.579 9649-9649/com.example.testviewlifecycle D/CustomView=-->: onVisibilityChanged
2020-03-10 14:43:50.582 9649-9649/com.example.testviewlifecycle D/MainActivity=-->: onDestroy
2020-03-10 14:43:50.583 9649-9649/com.example.testviewlifecycle D/CustomView=-->: onDetachedFromWindow
2020-03-10 14:43:50.584 9649-9649/com.example.testviewlifecycle D/MainActivity=-->: onDetachedFromWindow

3)、android:visibility="gone"作成
2020-03-10 14:45:03.585 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onCreate 1
2020-03-10 14:45:03.620 9921-9921/com.example.testviewlifecycle D/CustomView=-->: view Constructors 2
2020-03-10 14:45:03.620 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onFinishInflate
2020-03-10 14:45:03.621 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onCreate 2
2020-03-10 14:45:03.623 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onStart
2020-03-10 14:45:03.626 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onResume
2020-03-10 14:45:03.647 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onAttachedToWindow
2020-03-10 14:45:03.648 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onAttachedToWindow
2020-03-10 14:45:03.648 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onWindowVisibilityChanged
2020-03-10 14:45:03.648 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onVisibilityChanged
2020-03-10 14:45:03.680 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onWindowFocusChanged

破棄
2020-03-10 14:45:34.421 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onPause
2020-03-10 14:45:34.431 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onWindowFocusChanged
2020-03-10 14:45:34.978 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onWindowVisibilityChanged
2020-03-10 14:45:34.997 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onStop
2020-03-10 14:45:34.998 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onVisibilityChanged
2020-03-10 14:45:35.001 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onDestroy
2020-03-10 14:45:35.002 9921-9921/com.example.testviewlifecycle D/CustomView=-->: onDetachedFromWindow
2020-03-10 14:45:35.003 9921-9921/com.example.testviewlifecycle D/MainActivity=-->: onDetachedFromWindow

まとめ1、viewの作成プロセスは、2つのパラメータを持つコンストラクション関数を呼び出します.もちろん、このViewがlayoutで定義されていない場合は、1つのパラメータのコンストラクション関数が呼び出されます.2、XMLファイルからinflate完了(onFinishInflate()).3、WindowsにViewを追加します(Viewがgoneであれば、Viewの作成ライフサイクルも終了します).4、viewの縦横を測る.5.親ViewにおけるViewの位置を指定し、Viewがinvisibleの場合、Viewの作成ライフサイクルが終了します.6、Viewを描くcontent(onDraw()は、表示されるViewのみがwindowに描画されます.7、Viewの破棄プロセスは可視性とは関係ありません.
ActivityのonCreateメソッドにViewをロードすると、ViewのonFinishInflateが呼び出され、ActivityのライフサイクルがonResumeメソッドに実行されてからViewがウィンドウにアタッチされ、onMeasure、onSizeChanged、onLayout、onDrawが描画されます.これらの方法はsetVisibleまたはonResumeによって複数回呼び出される可能性があり、最後にWindowが焦点を失った後の破棄段階である.
参考Android表示フレームワーク:AndroidアプリケーションビューのキャリアView