大众号:字节数组,热衷于共享 Android 体系源码解析,Jetpack 源码解析、抢手开源库源码解析等面试必备的知识点

Android 体系中,数组的定义Window 在代码层次上是一个抽象类,java游戏在概念上标明的是一个窗口。Andcanvas下载roidjava怎样读 中悉数的视图都是经过 Window 来出现的,例如 Activity、Dialog 和 Toast 等,它们实践上都是挂载在 Window 上的。大部分情面试技巧和注意事项况下运用层开发者canvas渠道很少需求来和 Window 打交道,Activity 现已躲藏了 Window 的详细完毕逻辑了,但我觉得来了解 Window 机制的一个比较大canvas体系上海交通大学的长处是能够加深咱们对 View 制作流程面试问题以及作业分发机制的了解,这两个操作就触及到咱们的日常开发了,数组c言语完毕自定义 View 和处理 View 的滑动抵触时都需求咱们把握这方面的知识点,而这两个操作和 Window 机制有很大的相关。视图树只要被挂载到 Window 后才数组和链表的差异会触发视图树的制作流程,之后视图树才数组词有机遇接收到用户的接触作业。所以说,视图树被挂载到了 Window 上是 Activity 和 Dialog 等视图能够展示到屏幕上且和用户做交互的前置条件

本文就以 Activity 为比方,打开windows怎样激活阐明 Activity 是怎样挂载到 Window 上的,根据 Andr面试毛遂自荐3分钟通用oid API 30 进java编译器行剖析,期望对你有所帮助javascript

一、Window

Window 存在的含义是什么呢?

大部分状况下,用户都是在和运用的 Activity 做交互,运用在 Activity 上接收用户的输入并在 Acwindows10tivity 上向用户做出交互反馈。例如,在 Activity 中闪现了一个 Button,windows许可证即将过期怎样办当用户点击后就会触发 OnClickListWindowsener,这个进程中用户便是在和 Activity 中的视图树做交互,此刻还没有什么问题javahdxx。但是,当需求在 Activity 上弹出 Dialog 时,体系需求确保 Dialog 是会掩盖在 Activity 之上的,有接触作业时也需求确保 Dialog 是先于 Activity 接收到的;当建议一个新的 Activity 时又canvas需求掩盖住上一个 Activity 闪现的 Dialog;在弹出 Toast 时,又需求确保 T数组c言语oast 是掩盖在 Dialog 之上的

这种种要求就触canvassing及到了一个层次处理问题,体系需求对当时屏canvas交大登录幕上闪现的多个视图树进行一起处理,这样才调来决议不同视图树的闪现层次以及在接收接触作业时的优先级。体系就经过 Wicanvas交大登录ndow 这个概念来完毕上述目的

想要在canvas体系上海交通大学屏幕上闪现一个 Wind面试毛遂自荐ow 并不算多复杂,代码大致如下所示

	private val windowManager by lazy {
conte面试技巧xt.getSystemService(Context.WINDOW_SERVICE) awindows10激活密钥s WindowManagwindows10er
}
private val floatBallView by lazy {
FloatBallView(context)
}
privawindows怎样激活te val floatBallWindowindows10wParams: WindowManager.LayoutParams by lazy {
WindowManager.LayoutParams().apply {
width数组公式 = FloatBallView.VIEW_WIDTH
height = FloatBallView.VIEW_HEIGHT
gcanvas标签ravity = Gravity.START or Gravity.CENTER_VERTICAL
flags =
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_NOT_TOU面试问题CH_MODAL
type = if (Build.VERSION.SDcanvas软件K_INT < Build.VERSION_CODES.O) {
WindowManagejavahdxxr.LayoutParams.TYPE_SYSTEM_ALEcanvasRT
} else {
WindowManager.LayoutParacanvas交大ms.TY数组的定义PE_APPLICATION_OVERLAY
}
}
}
fun showFloatBall(java根底知识点) {
windowManager.addView(floatBallView, floatBallWindowPacanvasrams)
}

闪现一个 Window 最根柢的操作流程有:

  1. 声明期望闪现的 View,即本比方中的 floacanvas体系上海交通大学tBallView,其承载了咱们期望用户看到的视图界面
  2. 声明 View 的方位参数和交互逻辑,即本比方中的 floatBallWindowParams,其规矩了 floatBall数组c言语View 在屏幕上的方位,以及和用户之间的交互逻辑
  3. 经过 WindowManager 来增加 floatBallView,然后数组和链表的差异将 floatBallView 挂载到 Window 上,WindowMwindows7旗舰版anager 是外界拜访 Window 的进口

当中,WindowManager.LayoutParams 的 flags 特色就用于操控 Window 的闪现特性和交互逻辑,常见的有以下windows7旗舰版几个:

  1. WindowManager.LayoutParams.FLAjava名优馆在线六区G_NOT面试问题大全及答案大全_FOCUSABLE。标明当时 Window 不需求获取焦点,也不需求接收各种按canvas键输入作业,按键数组排序作业会直接传递给下层具有焦点的 Window

  2. WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL。标明当时 Window 区域的单击作业期望自己处理,其它区域的作业则传递给其数组指针它 Window

  3. WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED。标明当时 Window 期望闪现在锁屏java怎样读界面

此外,WindowManager.LayjavascriptoutParams 的 type 特色就用于标明数组初始化 Window 的类型。Window 有三种类型:运用 Window、子 Windocanvasw、体系 Window。运用类Window 对应 Activity。子 Window 具有依托联络,不能单独存在,需求从属在特定的父 Window 之中,比方 Dialog 便是一个子面试必问10大问题答复 Wwindows10激活密钥indow。体系 Window 是需求声明权限才调创建的 Window,比方 Toast 和 statusBar 都是系面试问题统 Window

从这也能够看出,体系 Wcanvas交大indow数组c言语 是处于最面试问题顶层的,所以说 type 特色也用于操控 Window 的闪现层级,闪现层级高的 Window 就会掩盖在闪现层级低的 Window 之上。运用 W面试必问10大问题答复indow 的层级规划是 1~99,子 Window 的层级规划是 1000~1999,体系 Wi数组初始化n面试必问10大问题答复dow 的层java根底知识点级规划是 2000~2999。假定想要让咱们创建的 Window 位于其它 Wcanvas交大indow 之上,那么就需求运用比数组指针较大的层级值了,但想要闪现自定义的体系级 Window 的话就必须向系面试毛遂自荐一分钟统动态恳求权限

WindowManager.面试毛遂自荐简略大方LayoutParams 内就声明晰这些层级值,咱们能够择需选取。例如,体系状况栏本身也是一个 Window,其 type 值便是 TYPE_STATUS_BAR

    public static class Laycanvas交大登录outParams extends ViewGroup.LayoutParams implements Parcelable {
public i面试技巧nt type;
//运用 Window 的开始面试常见问题及答复技巧
public static final int FIRST_APPLICATION_WINDOW = 1;
//运用 Window 的完毕值
publi面试技巧c static final int LAST_APPLICATION_WINDOW = 99;
//子 Window 的开始值
public static final int FIRST_SUB_WINDjava根底知识点OW = 1000;
//子 Window 的完毕值
public static final int LAcanvas交大ST_SUB_WINDOW = 1999;
//体系 Windowjava面试题 的开始值
public static fi面试毛遂自荐一分钟nal int FIRST_SYSTEM_WINWindowsDOW = 2000;
//体系状况栏
public static final int TYPE_STAwindows更新TUS_BAR         = FIRST_SYSTEM_WINDOW;
//体系 Window 的完毕值
public数组去重的5种办法 static fin面试技巧和注意事项al int LAST_SYSTEM_WINDOW = 2999;
}

二、Winwindows是什么意思dowManager

每个 Window 都会相关一个 View,想要闪现 Wind面试问题ow 也离不开 WindowManager,WindowMan面试问题ager 就供给了对 View 进行操作的才干。WindowManager 本身是一个接口,其又继承了windows7另一个接口 ViewManager,WindowManager 最根柢的三种操作行数组公式为就由 ViewManager 来面试毛遂自荐3分钟通用定义,即增加 View、更新 View、移除 View

public interfaccanvase ViewManager {
p数组排序ublic void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.windows怎样激活LayoutParams params);
public void removeView(Viewindows10w view);
}

WindowManager 的完毕类是 Windcanvas交大owManagerImpl,其三种根柢的操作行为都交由了 WindowManagerGlwindows10激活密钥obal 去完毕,这儿运用到了桥接方式

puwindows怎样激活blic final class Wwindows是什么意思indowManagerImpl implements WindowManager {
private final WindowMancanvas软件agerGlobal mcanvas中文Global = WindowManagerGlobal.getInstance();
@Override
public void addView(@NonNull View view, @Nonwindows是什么意思Null ViewGroup.LayoutParams params) {
applyDefaultToken(params);
mGlobal.addView(view, params, mContext.getDisplayNoVerify(), mParentWindow,
mConte数组指针xt.getcanvas中文UserId());
}
@Override
public void updateViewLayout(@NonNull Viejava名优馆在线六区w view, @NonNull ViewGroup.LayoutParams params) {
applyDefaultToken(params);
mGlobal.面试毛遂自荐一分钟u面试毛遂自荐pdateViewLayout(view, param数组c言语s);
}
@Overrwindows体系ide
public void removeView(View view) {
mGlobal.removeView(view, fal数组c言语se);
}
}

这儿首要看下 Wi数组词ndowManagerGlobajavahdxxl 是怎样完毕 addView 办法的即可

首要,WindowManagerGlobjava模拟器al 会对入参参数进行校验,并对 LayoutPajavascriptrams 做下参数调整。例如,假定当时要闪现的是子 Window 的话,那么就需求使其 Lay数组词outParams 遵从父 Window 的要求才行

	puwindows体系blic void addView(View view, ViewGrou面试问题p.Lawindows7旗舰版youtPaCanvasrams params,
Display display, Window parentWindow, injavascriptt userId) {
if (view == null) {
thr面试问题ow new I面试毛遂自荐一分钟llegalArgument数组排序Exception("view must not be null");
}
if (display == null) {
throw new IllegalArgumentException("display must not be null");
}
if (!(parawindows体系ms instanceof WindowManager.LayoutParams)) {
throw new IllegalArgume面试ntEjava模拟器xception("Params mjava模拟器ust be WindowManager.LayoutParams");
}
final WindowManager.LayoutParams wparams = (WindowManager.数组排序LayoutParams) params;
if (parentWindow != null) {
parentWindowcanvas标签.adj面试ustLayoutParamsForSubWindow(wparams);
} else {
// If there's no pjavascriptarent, then h数组的定义ardware acceleration for this view is
// set from the applicationwindows怎样激活's hardware acceleration setting.
final Context context = view.getContext();
if (context != null
&& (context.数组公式getApplicationInfo().flags
& ApplicationInfo.FLAjavahdxxG_HARDWAcanvasRE_ACCELER数组排序ATED数组) != 0) {
wparams.flags |= WindowManager.LayoutParams.FLAG_数组HARDWARE_ACCELERATED;
}
}

}

之后数组排序就会为当时的视图树(即 view)构建一个windows怎样激活相关的 ViewRootImpl 方针,经过 ViewRootImpl 来制作视图树并完毕 Window 的增加进程。ViewRootImpjava环境变量装备l 的 setView办法会触发建议整个视图java编译器树的制作流程,即完毕视图树的 Measure、Layout、Draw 流程,详细流程能够看我的另一篇面试毛遂自荐文章:一文读懂 View 的 Measure、Layout、Draw 流程

	public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow, int userId) {

ViewRootImpl root;
View panelParejava游戏ntView = null;

root = new ViewRootImpl (view.getContextjava怎样读(), display);
view.setLayoutParams(wparams);
mViews.add(view);
mRoots.add(root);
mParams.add(wpajava名优馆在线六区rams);
// do this last because it数组排序 fires off mess数组去重ages to start doing t面试问题hin数组gs
try {
//建议和 view 相关的整个视图树的制作流程canvas渠道
roo面试技巧和注意事项t.setView(view, wparams, panelParentView, userId)windows更新;
}数组初始化 catch (RuntimeException e) {
//数组公式 BadTokenException or Inwindows更新validDisplayException, clean up.
if (index >= 0) {
removeVicanvas交大ewLocked(index, true);
}
throw e;
}
}

ViewRwindows体系ootImpl 内部究竟会经过 WindowSession 来结Canvas束 Window 的增加进程,mWindowSession 是一个Bindjava名优馆在线六区er方针,实在的完毕类是 Session,也便是说,Window 的增加进程触及到了 IPcanvassingC 调用。后canvas软件边就比较复杂了,才干有限就不持续看下去了

        mwindows10OrigWindowType数组c言语 = mWindowAttributeswindows10激活密钥.type;
m面试毛遂自荐AttachInfo.mRecomputeGlobalAttribjava根底知识点utes = true;
collectViewAttributes();
adjustLayoutParajavascriptmsForCompatibility(mWindowAttributes);
res = mWindowSession.addToDisplayAsUser(
mWindow, mSeq, mWindowAttributes,
getHo面试问题stVisibility(),java名优馆在线六区 mDisplay.getDisplayId(),windows更新有必要吗 userId, mTmpFrame,
mAttachInfo.mContentInsets, mAttachI面试毛遂自荐简略大方nfo.mStableIns数组和链表的差异ets,面试毛遂自荐一分钟
mAtta数组chInfo.mDisplayCutout, inputChannel,
mTempInsets, mTempControls
);
sejava面试题tFrame(mTmpFrame);

需求留心的是,这儿所讲的视图树代表的是很多种不同的数组去重的5种办法视图方式。咱们知道,在建议一个 Actijavahdxxvity 或许闪现一个 Dialog 的时分,都需求为它们指定一个布局文件,布局文件会经过 LayoutInflater 加载映射为一个详细的 View 方针,即究竟 Activity 和 Dialog 都会被映射为一个 Vie面试毛遂自荐3分钟通用w 类型的视图树,它们都会经过 WindowManager 的 addView 办法来闪现到windows更新有必要吗屏幕上,WindowManager 关于 Activitycanvassing 和 Dialog 来说具有一起的操作行为进口

三、Activity & Window

这儿就以 Activity 为比方来打开阐明 Window 相关的知数组指针识点,所以也需求先对数组c言语 Activity 的组成结构做个大致的介绍。Activity 和 Window 之间的联络能够用以下图片来标明

一文读懂 View & Window 机制

  1. 每个 Activity 均包括一个 Window 方针,即 Awindows怎样激活ctivitywindows7旗舰版 和 Window 是1对1的联络

  2. Windowjavascript 是一个抽象类,其仅有的完毕类是 PhoneWindow

  3. Phone面试毛遂自荐3分钟通用Window 内部包括一个 DecorView,DecorView 是 FrameLayout 的子类,其内部包括一个 LinearLayout,LinearLayou数组的定义t 中又包括canvas体系上海交通大学两个自上而下的 childView,即 ActionBar 和 Cowindows是什么意思ntentParcanvas软件ent。咱们数组初始化平常在 Activity 中调用的 setContentView 办法实践上便是在向 ContentParent 实行 addView 操作

Window 这个抽象类里定义了多个和 UI 操作相关的办法,咱们平常在 Activity 中调用的setContentViewfindViewById办法都canvas交大登录会被转交由 Window 来完毕,Window 是 Activity 和数组去重的5种办法视图树体系交互的进口。例如,其 getDecorView() 办法就用于获取内嵌的 DecorView,findViewById(面试毛遂自荐一分钟) 办法就会将详细逻辑转交由 DecorView 来完毕,因为 Dwindows10ecorView 才是实在包括 contentView 的容器类

public abstr数组的定义act class Window {
public Window(Context conWindowstext) {
mContext = context;
mFeatures = mLocalFeatures = getDefaultFeatures(context);
}
public abstract void se面试问题tContentView(@LayoutRes int lay数组和链表的差异outResID);
@Nullable
public <T extends数组排序 View> T findViewById(@IdRes int id) {
return getD数组词ecJavaorView().findVcanvas体系上海交通大学iewById(id);
}
public abstract void setTitle(CharSequence title);
p数组初始化ublic abstract @NonNull Viewwindows10激活密钥 ge数组tDecorView();

}

四、Activity # setContentVie面试技巧和注意事项w

每个 Activity 内部都包括一个 Window 方针 mWindow,在 attach 办法中完毕初始化,这阐明 Activity 和 Window 是1对1的联络。mWindow 方针对应的是 PhoneWindow 类,这也是 Window 的仅windows是什么意思有完毕类

public class Activity extejavascriptnds ContextThemeWrapper implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCa数组公式llback,
AutofillManager.canvas标签AutofillClient, ContentCaptureManjava面试题ager.ContentCaptjava怎样读ureClient {
@UnsupportedAppUsage
private Window mWindow;
@UnsupporjavascripttedAppUsage
private WindowManager mWindowManager;
@UnsupportedAppUsage
final void attach(Context context,数组的定义 ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent inten面试毛遂自荐t, ActivityInfo info,
CharSequence twindows更新itle, Activity parent, String id,
NojavascriptnConfigurationInstances lastNonConfiCanvasgurationInstances,
Configu数组c言语ration config, String referrer, IVjava怎样读oiceInterawindows10ctor voiceInteractor,
Window window, ActivityConfigCallbackjava根底知识点 activ数组的定义ityConfigCallback, IBinder assistTojavahdxxken) {
attachBaseContext(context);
mFragmJavaents.atjavahdxxtachHost(nu数组的定义ll /*parent*/);
//初始化 mWindow
mWindow = new PhoneWindow(this, window, ac面试技巧和注意事项tivityConfigCallback);
mWindow.setWindowControllerCallback(mWindowControllerCallback);
mWindow.setCallback(this);
mWindow.setOnWindowDismissedCallback(t数组和链表的差异his);
mWindow.getLayoutInflater().setPrivateFactory(this);

}
public void setContentVi面试毛遂自荐ew(@Lwindows10激活密钥ayoutRes int layoutRe数组去重的5种办法sID) {
getWindow(javahdxx).setContentViejava游戏w(layoutResID);
initWindcanvas体系上海交通大学owDecorActionBar();
}
}

Activity 的atjavascripttach 办法又是在 ActivityThread 的 performjava根底知识点LaunchActivi面试问题大全及答案大全ty 办法中被调用的,在经过反射生成 Activity 实例windows7后就会调用attach 办法,且能够看到该办法的调用数组的定义机会是早于 Activity 的 onCreate 办法的。所以说,在生成 Activity 实例后不久其 Window 方针就windows10现已被初始化了,并且早于各个生命周期回调函数

	private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

Activity activity = null;
try {
java.lang.ClassLoaderjavahdxx cl = appContext.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intcanvas标签ent.setExcanvas中文trasClassL面试技巧和注意事项oader(cl);
r.intent.prepareToEnterProcess();
if (r.面试毛遂自荐一分钟state != null) {
r.state.setClassLoader(cljava模拟器);
}
} catch (Exception e) {
if (!mInstrumentation.onException(activity, e)) {
throw new RuntimeException(
"数组去重Unable to instantiate activity " + component
+ ": " + e.toString(), e);
}
}

activity.attach(appContext, th数组去重is, getIn面试技巧和注意事项strumentation(), r.token,
r.ident, app, r.inCanvastent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config,
r.referrer, r.voiceInteractor, window, r.confi数组的定义gCalcanvas交大lback,
r.assistToken);

i数组c言语f (r.isPersistable()) {
mInstrumentatjava编译器ion.callActicanvas软件vityOnCreatejava怎样读(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(act数组公式ivity, rjava模拟器.state);
}
return acti数组初始化vity;
}

此外,从 Activity 的setContentView 的办法签名来看,详细逻辑都交由了 Window 的windows更新同名办法来完毕,传入的 lcanvas渠道ayoutResID 便是咱们期望在屏幕上出现面试毛遂自荐的布局,那么 PhoneWindow 天然就需求去加数组的定义载该布局文件生成对应的 View。而为面试毛遂自荐3分钟通用了能够有一个对 View 进行一起处理的进口,View 应该要包括在一个指定的 ViewGroup 中才行,该 ViewGroup 指的便是 DecorView

下面就再来看下 PhoneWindow 是怎样处理这一个流程的

五、PhoneWindow # setContentView

PhoneWindow 的 setContentView 办法的逻辑能够总canvas标签结为:

  1. PhoneWindow 内部包括一个 DecorView 方针canvas下载 mDecor。DecorView 是 FrameLayout 的子类,其内部包括两个咱们经常会接触到的 chil数组初始化dView:actionBar 和 con数组初始化tentParent,actionBar 即 Activity 的标题栏,contentParent 即 Activity 的视图内容容器
  2. 假定 mContentParencanvas下载t 为 null 的话则调用 installDwindows许可证即将过期怎样办ecor() 办法来初始化 DecorView,然后一起初始化 mContentParent;不为 null 的话则移除 mContentPar面试常见问题及答复技巧ent 的悉数 chil面试毛遂自荐简略大方dView,为 layojava名优馆在线六区utResID 腾出方位(不考虑转场动画,实践上究竟的操作都相同)
  3. 经过LayoutInflater.inflate生成 layoutResID面试必问10大问题答复 对应的 View,并数组c言语将其增加到 mContentParent 中,然后将咱们的方针视图挂载到一个一起的容器中(不考虑转场动画,实践上究竟面试问题的操作都相同)
  4. 当 ContentView 增加完毕后会回调 Callback.onContentChanged 办法,咱们能够经过重写 Activity 的该办法然后得到布局内容改动的奉告

所以说,Acjava怎样读tivity 的 setContentView 办法实践上便是在向canvassing DecorView 的 mContentParent 实行 addView 操作,java名优馆在线六区所以该方windows7法才叫setContentView而非setViewindows怎样激活w

publiwindows怎样激活c class PhoneWindow ecanvas软件xtends Window implements Mencanvas体系上海交通大学uBuilder.Callwindows是什么意思back {
private DecorView mDecor;
ViewGroup mContentParent;
@Override
public void setContentView(int layoutRewindows更新有必要吗sID) {java名优馆在线六区
// Note: FEATURE_CONTENT_TRANSITIONS may be set in the面试毛遂自荐简略大方 process of iJavanstalling the window
// decor, when theme attributes and the like are crystalized. Do nojava根底知识点t check the feature
// before this happens.
if (mContentParent == null) {
installDecor();面试毛遂自荐简略大方
} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
mContentParent.removeAllViews();
}
if (hasFeature(FEATURE_CONWindowsTENT_TRANSITIONS)) {
final Scene数组和链表的差异 newScene = Scene.getSceneForLayo数组指针ut(mContentParent, layoutResID,
getCocanvas渠道ntext());
tr面试常见问题及答复技巧ansitionTo(newScene);
} else {
//将 layoutResID 对应的 View 增加到 mContjava面试题entParent 中数组公式
mLayoutInflater.inflate(lajava怎样读youtResID, mConte数组初始化ntParent);
}
mContentParent.requestApplyInsets();
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
//回调奉告 contentView 发生变化了
cb.onContentChanged();
}
mContentParentExplicitlySet = true;
}
private void installDecor() {
mForceDecorInstall = faljava面试题se;
if (mDwindows7旗舰版ecor == null) {
mDeccanvas交大or = generateDecor(-1);
mDecor.set数组词DescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
mDecor.setIsRootNamespace(true);
if (!mI面试常见问题及答复技巧nvalidatePanelM面试毛遂自荐一分钟e数组c言语nuPosted && mInvalidatePanelMenuFeatures != 0) {
mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
}
} else {
mDecor.setWindow(this);
}
if (mContentPwindows10激活密钥are数组去重的5种办法nt == null) {
mContentParent = generatcanvas体系上海交通大学eLayout(mDecor);
// Set up decor part of UI to ignore fitsSystemWindows if appropriate.
mDecor.makeFrameworkOptionalFitsSystemWindows();
final Decor数组词ContentParent decorContentParent = (DecorContentParent) mDecor.findViewById(
R.id.decor_content_parwindows7ent);
if (decorContentParent != null) {
mDecorContentParent = dcanvas软件ecorCont面试必问10大问题答复entParent;

} else {

}

}
}
}

mContentParent 经过 generateLayout 办法来完毕初始化,该办法首要完毕的操作有两个:

  1. 读取咱们为 Activity 设置的 theme 特色,以此装备根底的 UI 风格。例如,假定咱们设置了数组和链表的差异 <item name="windowNoTitle">true</item>的话,那么就会实行 requestFeature(FEAT数组的定义URE_NO_TITLE) 来躲藏标题栏
  2. 根据javahdxx features 来挑选合适的布局文件,得到 layoutResource。之所面试毛遂自荐一分钟以会有多种布数组和链表的差异局文件,是因为不同的 Activity 会canvas有不同的闪现要求,有的要求闪现 title,canvas渠道有的要求闪现 leftIcon,而有的或许全都不需求,为了防止控件冗余就需求来挑选合适的布局文件。而尽管每种布局文件结构上略有不同,但均会包括一个 Iwindows7D 名为contentcanvas渠道的 FrameLayout,mContentParent 就对应该 FrameLayout。DecorView 会拿到 layoutResource 并生成对应的 Vi数组的定义ew 方针(对应 DecorView 中的 mContentRoot),并将其面试毛遂自荐一分钟增加为mContentParent的 childView
	protected ViewGroup generateLayout(DecorView decor) {
// Apply data from current theme.
TypedArray a = getWindowStyle();

//第一canvas
if (a.getBoolean(R.styleable.Window_windowNoTitle, false)) {
requestFeature(FEATURE_NO_TITLE);
} else if (a.getBoolean(R.styleab面试常见问题及答复技巧le.Window_windowActionBar, faljava编译器secanvas下载)) {
// Don't allow an action bar if there is no title.
requestFeature(FEATURE_ACTION_BAR);
}

// Inflate the window decjava名优馆在线六区or.
//第二步
int layoutResource;
int features = getLocalFeatures();
// System.out.println("Features: 0x" + Integer.toHexString(features));

//交由 DecorVie数组w 去生成 layoutcanvas交大登录Resource 对应的 View
mDecor.onResou数组词rcesLoaded(mLayoutInflater, layoutResource);
//正常来说每种 layoutResource 都会包括一个 ID 为 ID_ANDROID_CONTENT 的 Viewcanvas交大Group
//假定找不到的话就直接抛出反常数组的定义
ViewGroup contentParent = (ViewGroup)canvas标签findV数组去重的5种办法iewById(ID_ANDROID_CONTENT);
if (conwindows10激活密钥t数组的定义entPajava面试题ren数组初始化t == null) {
throw new RuntimeException("Wicanvasndow couldn't findcanvas体系上海交通大学 content container view");
}

return contentParent;
}

六、DecorView

DecorView面试毛遂自荐简略大方 是 FrameLayout 的子类,其 onResourcesLoaded 办法在拿到 PhoneWindow 传递过来的 layoutResource 后,就会数组去重的5种办法生成对应的 View 并增加为自己的 childView,就像一般的 ViewGro面试毛遂自荐简略大方up 经过 addView 办法来增加 childView 相同,该 childView 就对应 mContentRoot,咱们能够在 Activity 中经过(window.decorView as ViewGroup).getChildAt数组指针(0)来获取到 mContentRoot

所以 Decorcanvas标签View 能够看做是 Activity 中整个视图树的根布局

pu数组排序blic class面试毛遂自荐 DecorView extends FrameLayout implements RootViewSurfaceTaker, WindowCallbacks {
@UnsupportedAppUsage
private PhoneWindow mWindow;
ViewGroup mContentRoot;
Decor数组词View(Context context, incanvas渠道t featureId, PhoneWindow window,
WindowManager.LayoutParams params) {

}
voidcanvas标签 onResou面试毛遂自荐简略大方rcesLoaded(LayoutInflater inflater, int数组指针 layoutResource) {
if (mBackdropFrameRenderer != null) {
loadBackgroundDrawablesIfNeeded();
mBackdropFrameRendererwindows更新.onR数组公式esourcesLoaded(
this,canvas体系上海交通大学 mResizingBackgroucanvas渠道ndDrawable, mCaptionBackgroundDrawable,
mUserCaptionBacjava模拟器kgroundDrawable, getCurrentColorcanvas标签(mStatusColorViewState),
getCurrentColor(mNavigationColorViewState));
}
mDecorCaptionView = creajava编译器teDecojava环境变量装备rCaptcanvas体系上海交通大学ionView(icanvasnflater);
final View root = inflater.inflatejava游戏(layoutResource, null);
if (mDecorCajava面试题ptionView != nujava怎样读ll) {
if (mDecorCaptionVi面试问题大全及答案大全ew.getParent() == null) {
addView(mDecor面试常见问题及答复技巧CaptionView,
new Vicanvas渠道ewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
}
mDecorCaptionView.addView(root,
new ViewGroup.MarginLayoutParams(MATCH_PARENT, MATCH_PARENT));
} else {
// Put it below the color views.
addView(root, 0, new ViewGroup.Layout面试毛遂自荐Params(MATCH_PARENT, MATCH_PARENT));
}
mContentRoot = (ViewGroup) root;
initializeElevation();
}
}

七、canvas体系上海交通大学ActivityThread

完毕以上进程后,此刻其实还仅仅完毕了 Activity 整个视图树的加载作业,尽管 Activity 的 attach办法现已创建了 Window 方针,但还需求将 DecorView 提交给 WindowMwindows更新anager 后才调正式将视图树展示到屏幕上

DecorView 详细的提交机会还需求看 ActivityThread 的 handleResumeActivity 办法,该办法用于回调 Activity 的 onResume 办法,里面就会回调到 Activity 的数组初始化makeVisibljava环境变量装备ewindows10 办法,从办法名就能够猜出来makeVisible就用于令windows更新 Activity 变为可见状况

	@Override
public void handleResumeActivity(IBinder token, boolean finalStateRequest, bo面试问题olean isForward, String reason) {

r.activity.makeVisible();

}

makeVisible 办法会判别当时 Activitjava游戏y 是否现已将 DecorView 提交给 WindowManager 了,假定还没的话就进行提交,最终将 DecorView 的可见面试问题状况设为 VISIBLE,至此才建立起 Activity 和 WindowManager 之间的相关联络,Activity 也才正式变为可见状况

    void makeVisible() {
if (!mWindowAdded) {
ViewManager wm = getWindowManager();
wm.addView(mDecor, getWindow().getAttributes());
mWindowAdded = truejava编译器;
}
mDecor.setVisibility(View.VISIBLE);
}

八、做下总结

对以上流程做下总结

  1. 每个 Activity 内部都包括一个 Window 方针,该方针的详细完毕类是 PhoneWindow。Activity 的 setContentViewfindViewByjava根底知识点Id 等操面试技巧和注意事项作都会交由 Window 来完毕,Window 是 Activity 和整个 Vwindows10激活密钥ie面试问题w 体系交互的进口
  2. PhoneWindow 根据 theme 和 features 得知 Activity 的根柢视图特色,由此来挑选合适的根布局文件 layoutResource,每种 layoutResourwindows更新有必要吗ce数组的定义然在布局windows10激活密钥结构上略有不同,但是均会包括一个 ID 名为content的 FrameLayout,ContentParent 即该 FrameLayout。面试毛遂自荐3分钟通用咱们能够经过 Winwindows更新有必要吗dow.ID_ANDROID_CONTENT来拿到面试毛遂自荐该 ID,也能够在 Activi面试问题ty 中经过 findViewById<View>(Window.ID_ANDROID_CONTENT) 来获取到ContentParent
  3. PhoneWindow 并不直接处理视图树,而是交由 DecorView 去处理。DecorView 会根据layoutResource来生成对应的 rootView 并将数组指针开发者指定的 ContentView 增加为ContentParent的 childView,所以能够将 DecorView 看做是视图树的根布局。正因为如此,Activity 的 findVwindows体系i数组去重的5种办法ewById 操作实践上会先交由 Windcanvassingow,Window 再交由 DecorView 去完毕面试毛遂自荐3分钟通用,因为 DecorView 才是实践持有 ContentView 的容器类
  4. PhoneWiwindows10ndo面试毛遂自荐3分钟通用w 是 Winwindows是什么意思dow 这个抽象类的的仅有完毕类,canvas体系上海交通大学Activity 和 Dialog 内部其实都是运用 PhoneWindow 来加载视图树,因而 PhoneWindow 成为了上层类和视图树体系之间的交互进口,然后也将 Activity 和 Dialog 的一起视图逻辑给抽象出来了,减轻了上层类的背负,这也是 Window 机制存java名优馆在线六区在的windows10长处之一
  5. Activity 的视图树是在makeVis数组排序iblewindows更新法里提交给 WcanvassingindowManagwindows7旗舰版er 的,之后 WindowManagerImpl 会经过 ViewRootImpl 来完毕整个视图树的制作流程,至此 Activity 才对用户可见
  6. View 经过 Canvas 制作本身,定义了详细的 UI 效果。View 和 ViewGroup 一起组成一个详细的视图树,视图树的根布局则是 DecorView,DecorViewcanvas软件 的存在使得视图树有了一个一起的容器,有利于一起体系的主题款式并对悉数 childView 进行一起处理。Activity 经过 Window 和视图树进行交互,将具java模拟器体的视图树处理逻辑抽取给 PhoneWindow 完毕,Canvas减轻了本身背负。PhoneWindow 拿到 DecorViewjavascript 后,又经过 ViewRootImpl 来对 DecorView 进行处理,由其来完毕整个视图树的 Measure、Layout、Draw 流程。当整个视图canvas树制作完毕后,就将 DecorView 提交给 WindowManager,然后将 Activity 闪现到屏幕上

九、一个 Demo

面试必问10大问题答复儿我也供给一个自定义 Window 的 Demo,完毕了根柢的拖拽移动和点击作业java怎样读,代码点击这儿:面试问题AndroidOpenSourceDemo

一文读懂 View & Window 机制

十、一文系列

最近比较倾向于只用一篇文章来写一个知识点,也懒得总是想文章标题,就一贯沿袭一初面试毛遂自荐一分钟步用面试技巧和注意事项一文读懂XXX,写着写着也攒了蛮多篇文章了,之前也现已写了几篇关于 View 体系的文章,期望对你有所帮助

  • 一文读懂 View 的 Measure、Layout、Dra数组词w 流程
  • 一文读懂 View.Post 的原理及缺陷
  • 一文读懂 View 作业分发机制
  • 一文读懂 Handler 机制全家桶
  • 一文读懂 SharedPreferences 的缺陷及一点点思考
  • 一文读懂 Java & Kotlin 泛型难点
  • 一文快速入门 Kotlin 协程
  • 一文快速入门 Const面试raintLayout