我是靠谱客的博主 愉快眼神,最近开发中收集的这篇文章主要介绍android主动显示流程,Activity加载显示基本流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文章是基于Android源码6.0讲解Activity加载显示基本流程

首先上一张图给大家一个直观的了解

bv7mwc?w=445&h=539

首先一个布局页面的加载是在Activity中的setContentView(R.layout.res)开始;

我们就从Acitvity源码中的setContentView方法入手

public void setContentView(@LayoutRes int layoutResID) {

getWindow().setContentView(layoutResID);

initWindowDecorActionBar();

}

通过源码我们可以看到layoutResID又传给了getWindow()中的setContentView(layoutResID)方法;

mWindow = new PhoneWindow(this);

public Window getWindow() {

return mWindow;

}

getWindow()返回的是PhoneWindow的对象

我们来看PhoneWindow中setContentView(layoutResID)方法

PhoneWindow是一个隐藏类,在源码sources/andorid-23/com/android/internal/policy中

PhoneWindow中setContentView方法

@Override

public void setContentView(int layoutResID) {

if (mContentParent == null) {

installDecor();//Activity新创建时mContentParent 为空,调用installDecor方法

} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {

mContentParent.removeAllViews();

}

if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {

final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,

getContext());

transitionTo(newScene);

} else {

mLayoutInflater.inflate(layoutResID, mContentParent);

}

mContentParent.requestApplyInsets();

final Callback cb = getCallback();

if (cb != null && !isDestroyed()) {

cb.onContentChanged();

}

}

我们来看PhoneWindow中installDecor()方法中的关键部分

private void installDecor() {

if (mDecor == null) {

mDecor = generateDecor(); //@1

mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);

mDecor.setIsRootNamespace(true);

if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) {

mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);

}

}

if (mContentParent == null) {

mContentParent = generateLayout(mDecor); //@2

...

}

mLayoutInflater.inflate(layoutResID, mContentParent);//@3

}

在PhoneWindow源码中声明了 private DecorView mDecor;

DecorView 是PhoneWindow中的一个内部类继承了FrameLayout,是一个帧布局

private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {

...

}

@1 首先调用mDecor = generateDecor();返回的是一个 DecorView的对象,这就是所有页面的跟布局

protected DecorView generateDecor() {

return new DecorView(getContext(), -1);

}

@2 其次调用mContentParent = generateLayout(mDecor);

protected ViewGroup generateLayout(DecorView decor) {

...

} else if ((features & (1 << FEATURE_ACTION_MODE_OVERLAY)) != 0) {

layoutResource = R.layout.screen_simple_overlay_action_mode;

} else {

// Embedded, so no decoration is needed.

layoutResource = R.layout.screen_simple;

// System.out.println("Simple!");

}

View in = mLayoutInflater.inflate(layoutResource, null);

decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));

mContentRoot = (ViewGroup) in;

ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);

...

return contentParent;

}

这里的layoutResource是源码中的布局,我们来看一下R.layout.screen_simple

在sdk/platforms/android-23/data/res/layout路径中

android:layout_width="match_parent"

android:layout_height="match_parent"

android:fitsSystemWindows="true"

android:orientation="vertical">

android:inflatedId="@+id/action_mode_bar"

android:layout="@layout/action_mode_bar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:theme="?attr/actionBarTheme" />

android:id="@android:id/content"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:foregroundInsidePadding="false"

android:foregroundGravity="fill_horizontal|top"

android:foreground="?android:attr/windowContentOverlay" />

R.layout.screen_simple就是一个简单的线性布局,通过mLayoutInflater.inflate和decor.addView添加到DecorView中,

再通过ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT);把R.layout.screen_simple中id

为id/content的Framelayout赋值给contentParent

@3 最后通过mLayoutInflater.inflate(layoutResID, mContentParent);把我们写的布局添加到mContentParent中。

未完待续...

最后

以上就是愉快眼神为你收集整理的android主动显示流程,Activity加载显示基本流程的全部内容,希望文章能够帮你解决android主动显示流程,Activity加载显示基本流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部