@linux1s1s
2016-11-07T11:50:37.000000Z
字数 5491
阅读 2743
AndroidRefine 2016-11
系列博文:
Android 生命周期 - Activity
Android 生命周期 - Service
Android 生命周期 - BroadcastReceiver
Android 生命周期 - Fragment
Android 生命周期 - View
View中的常见方法简单介绍如下:
onFinishInflate(): 该方法当View及其子View从XML文件中加载完成后会被调用onMeasure(int, int):该方法在计算当前View及其所有子View尺寸大小需求时会被调用。onLayout(boolean, int, int, int, int):该方法在当前View需要为其子View分配尺寸和位置时会被调用。onSizeChanged(int, int, int, int):该方法在当前View尺寸变化时被调用。onDraw(android.graphics.Canvas):该方法在当前View需要呈现其内容时被调用。onFocusChanged(boolean, int, android.graphics.Rect):该方法在当前View获得或失去焦点时被调用。onWindowFocusChanged(boolean):该方法在包含当前View的window获得或失去焦点时被调用。onAttachedToWindow():该方法在当前View被附到一个window上时被调用。onDetachedFromWindow():该方法在当前View从一个window上分离时被调用。onVisibilityChanged(View, int):该方法在当前View或其祖先的可见性改变时被调用。onWindowVisibilityChanged(int):该方法在包含当前View的window可见性改变时被调用。
public class BCView extends View {@Overrideprotected void onVisibilityChanged(View changedView, int visibility) {super.onVisibilityChanged(changedView, visibility);Log.i(MainActivity.TAG, "BCView onVisibilityChanged(View changedView, int visibility) changedView = " + visibility);}public BCView(Context context, AttributeSet attrs) {super(context, attrs);Log.i(MainActivity.TAG, "BCView BCView(Context context, AttributeSet attrs)");}@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();Log.i(MainActivity.TAG, "BCView onAttachedToWindow()");}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);Log.i(MainActivity.TAG, "BCView onMeasure(int widthMeasureSpec, int heightMeasureSpec) widthMeasureSpec = " + widthMeasureSpec + " heightMeasureSpec = " + heightMeasureSpec);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);Log.i(MainActivity.TAG, "BCView onSizeChanged(int w, int h, int oldw, int oldh)");}@Overrideprotected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);Log.i(MainActivity.TAG, "BCView onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)");}@Overrideprotected void onFinishInflate() {super.onFinishInflate();Log.i(MainActivity.TAG, "BCView onFinishInflate()");}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);Log.i(MainActivity.TAG, "BCView onLayout(boolean changed, int left, int top, int right, int bottom) changed = " + changed + " left = " + left + " top = " + top + " right = " + right + " bottom = " + bottom);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Log.i(MainActivity.TAG, "BCView onDraw(Canvas canvas)");}@Overridepublic void onWindowFocusChanged(boolean hasWindowFocus) {super.onWindowFocusChanged(hasWindowFocus);Log.i(MainActivity.TAG, "BCView onWindowFocusChanged(boolean hasWindowFocus) hasWindowFocus = " + hasWindowFocus);}@Overrideprotected void onWindowVisibilityChanged(int visibility) {super.onWindowVisibilityChanged(visibility);Log.i(MainActivity.TAG, "BCView onWindowVisibilityChanged(int visibility) visibility = " + visibility);}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();Log.i(MainActivity.TAG, "BCView onDetachedFromWindow()");}}
public class MainActivity extends AppCompatActivity {public static final String TAG = "mutex";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i(TAG, "MainActivity onCreate()");}}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="fresco.mutex.com.lifecycle.MainActivity"><fresco.mutex.com.lifecycle.BCViewandroid:layout_width="80dp"android:layout_height="80dp"android:layout_centerInParent="true"android:background="@android:color/holo_blue_light" /></RelativeLayout>
启动以后,查看Log日志

从启动到View显示完整的生命周期如上所示,可以小结出大的轮廓如下:
Constructors()构造器 ---->> onFinishInflate() ---->> onAttachedToWindow --->> onMeasure ---->> onLayout() --->> onDraw()
接着Back回退

onWindowFocusChanged --->> onWindowVisibilityChanged --->> onDetachedFromWindow
接下来将上面的BCView属性设置invisible如下:
<fresco.mutex.com.lifecycle.BCViewandroid:layout_width="80dp"android:layout_height="80dp"android:layout_below="@id/activity_main_send"android:layout_centerInParent="true"android:visibility="invisible"android:background="@android:color/holo_blue_light" />
onVisibilityChanged()方法,后面缺少了onDraw()方法。
最后,我们将BCView的属性设置为Gone如下:
<fresco.mutex.com.lifecycle.BCViewandroid:layout_width="80dp"android:layout_height="80dp"android:layout_below="@id/activity_main_send"android:layout_centerInParent="true"android:visibility="gone"android:background="@android:color/holo_blue_light" />
onDraw()方法,同时onMeasure()以及onLayout()方法也没有了。
- View默认为可见的,否则先调用
onVisibilityChanged(),但是此时该View的长宽以及位置等信息都不知道。- 如果View是
invisible,则不会回调onDraw()方法- 如果View是
gone,则不会回调onMeasure(),onLayout(),onDraw()方法- 不管View是什么状态,总是会回调
onAttachedToWindow()以及onDetachedFromWindow()方法- View的销毁流程和可见性没有关系
- [onVisibilityChanged()可选] --> 构造器View() --> onFinishInflate() --> onAttachedToWindow() --> onMeasure() --> onSizeChanged() --> onLayout() --> onDraw() --> onDetackedFromWindow()
