UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

머리말

우리는 종종 다양한 문제의 UI를 그릴 때 그들을 안드로이드에 직면하고 해결하기 위해 위치를 알하지 UI 시스템의 경우, 때때로 당신은, 자신의 조정, 또는를 달성하기 위해 필요 사용자 지정 구성 요소를 개발해야 할 필요성을 변경할 때 특수 효과가 명확하지 않을 때, 당신은 UI 재미의 가장 기본적인 부분을 달성하고자하는 사용자 정의 생각, 그것은 UI의 과정에 포괄적 인 통찰력을 그릴 것입니다. 그럼 전체 UI 렌더링 시스템의 포괄적 인 분석에 당신을 데려 갈.

아이디어 : 안드로이드 프로그램 시작 - → 활동로드 전체 수명주기 - → setContentView- → 그래픽 렌더링

궁금 :

어떻게 활동 수명주기를 호출하는 시작하는 방법 1.Android 프로그램입니다?

2. 우리의 된 setContentView 어떻게 활동에서 onCreate 그들 UI 파일을로드하려면?

3.UI 방법을 그릴 것입니다?

답변 :

1.Android 프로그램 흐름

우리 모두 알다시피, 우리는 우리의 프로그램 항목 (메인 스레드)를 입력하는 것입니다,하지만 우리는 다음의 주요 방법, 안드로이드 사이를 못 찾았을 위해있는 우리는 안드로이드 일상적인 절차를 개발하는 주요 방법에 의존하는 개방 자바 프로그램을 필요로합니다 어떻게 실행 시작?

이이 클래스 중 안드로이드에서 명명 된 ActivityThread 클래스는 메인 스레드가 그들을 안드로이드, 우리가 더 익숙한 주요 메서드를 참조하십시오이 클래스에서, 지금 생각 않습니다 나타내는 친숙한 친구는 알고 있습니다 우리의 안드로이드 당신이 열 때 응용 프로그램이 클래스의 첫 번째 전화는 우리의 시작 지점으로 여기에 주요 전류입니다

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

다음은 호출 활동 부착 볼 수있다 () 메소드

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

여기에서 우리는 처음의 getService의 아웃 무엇을 고려해야 하는가?

내부되면, 우리는 발견 할 것이다

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

ActivityManagerService 서비스 시스템이라고하고, 어떤이, 중 바인더 인터페이스를 제공합니다

여기에, 다음, 우리는 안드로이드, 다음 사실 우리가 ActivityManager 시스템 서비스 호출 관리들 사이에서 통신 메커니즘 바인더, 생각, 우리는 프로세스 간 액세스 활동에 대해 이야기하는 이유는 인터페이스 중 바인더를 호출하여 수 이유

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

那么明白了这个时候能够得到ActivityManager之后,我们接着回到attach当中继续看下去, 这个时候会发现,我们调用了一个attachApplication方法(见图2)这个方法又是干嘛的?attachApplication在这里的作用其实实际上是ActivityThread通过attach获取到,然后将applciationThread将其关联,把activity相关信息存储在applciationThread里面,apllicationThread的类为activity的各种状态做了相对应的准备工作

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

这个时候我们需要关注,ApplicationThread当中做了什么?

当我们打开ApplicationThread中我们会看到一堆的schedle方法,这些方法的名称其实就可以给我们表明,代表的是在执行Activity的某种状态时调用的计划执行方法

这时我们会看到一个scheduleLaunchActivity方法,表示计划加载时调用的

这里我发现了一个很有意思的事情

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

这个上面我们会看到一个ActivityClientRecord对象,这个对象其实实际上就是我们的Activity

而且似乎每一个方法还干了一件让我们非常熟悉的一件事, 进行了一次sendMessage()将当前创建的Activity发送了出去

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

当走到这里我们会发现最终我们调用的是Handler的消息通信机制,也就是说,在这里我们可以总结一下,

当Activity状态改变时,都会有对应的一个消息发送出去

而接收这里,我能发现通过发送时不同的状态,这边调用了不同的handlerXXXActivity方法

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

在这里,我门貌似发现了Activity的生命周期的调用痕迹,那么其实到此为止,我门可以得出一个结论,

Application运行的过程当中,对于Activity的操作,状态转变,其实实际上是通过Handler消息机制来完成的,

Application当中只管去发, 由消息机制负责调用,因为在main方法当中我门的Looper轮训器是一直在进行轮训的

而当我们在加载Activity的时候,当中调用了一个performLaunchActivity()方法,在这个中间我发现了我们onCreate的调用痕迹

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

也就是说,到目前为止我们能够明白,整个Application加载Activity的整套流程是怎么回事

那么接下来我们需要关注的是,在onCreate当中我们所写的setContentView到底干了什么

2.setContentView

在onCreate当中我们往往会使用setContentView去进行设置我们自己的布局文件或者view,那么在这当中他到底是怎么做的?通过观察源码,这个时候通过一系列线索我找到了最终的位置PhoneWindow类

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

这个时候我们会看到他做了两个事情,一个是installDecor,另一个是inflate,这两个后一个不难猜出他是在进行布局文件的解析, 前面的我们认为她是在初始化某个东西

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

进来之后发现他初始化了两个东西,一个叫做mDecor,一个叫做mContentParent

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

我们看到了mDecor是一个DecorView

mContentParent是一个ViewGroup

透过注释的翻译,其实我们就能很明确知道这两个是用来干嘛的

// This is the view in which the window contents are placed. It is either(这是放置窗口内容的视图)

// mDecor itself, or a child of mDecor where the contents go.(它要么是mDecor本身,要么是mDecor的子类的内容。)

//This is the top-level view of the window, containing the window decor.(这是在窗口当中的顶层View,包含窗口的decor)

一个代表的是顶层view,一个用来装他下面的视图内容

在接着往下看的时候,我门发现,generateLayout方法当中,发现了在此处进行了大量的requestFeature的调用,也就是所,我们的requestFeature

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

然后在下面我门会发现在做了一件事情,

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

当前这里竟然在加载布局文件,并且生成了一个view, 但是好像貌似不是我门自己的

所以我们需要去探寻他到底加载了一个什么东东?

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

这是我找到了一个比较有意思的组件,

在这个上面我看到了一句这样的注释

//This is an optimized layout for a screen, with the minimum set of features

enabled.

这是一个屏幕的优化布局,具有最小的特征集启用。

通过注释和一些资料分析, 得到了一个比较坑的结果。

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

这是DecorView默认的一个渲染,然后我门自己的布局都是渲染到她的FrameLayout上的

那么在这里我门现在能够明白,installDector其实实际上是在初始化两个视图容器,然后加载系统的R资源及特征,产生了一个基本布局

那么接着回到之前我门关注的另外一个方法mLayoutInflater.inflate(layoutResID, mContentParent);

这个方法就比较好理解了,

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

这这段注释上面我门就可以得到一个信息

//Inflate a new view hierarchy from the specified xml resource.(从指定的视图当中获取试图的层次结构,意思就是,现在在加载自己的资源)

而具体流程就不贴代码了给各位上一张图

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

那么在这里我门就能够明白,setContentView其实做了两件比较核心的事情,就是加载环境配置,和自己的布局,那么接下来我门需要考虑的事情就是,他到底怎么画到界面上的

3.UI是如何绘制的?

通过前面两个章节,我门了解到,程序对于activity生命周期的调用,以及我们的视图资源的由来。这是我门需要找到的是我门的绘制起点在哪?

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

在ActivityThread启动时, 我发现在加载handleLaunchActivity方法调用performLaunchActivity方法之后又调用了一个handleResumeActivity在这里我发现了绘制流程的开始

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

通过前面的流程我门知道,onCreate之行完成之后,所有资源交给WindowManager保管

在这里,将我们的VIew交给了WindowManager,此处调用了addView

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

进入addView之后我们发现了一段这样的代码,他将视图,和参数还有我门的一个ViewRoot对象都用了容器去装在了起来,那么在此处我门可以得出,是将所有的相关对象保存起来

mViews保存的是View对象,DecorView

mRoots保存和顶层View关联的ViewRootImpl对象

mParams保存的是创建顶层View的layout参数。

而WindowManagerGlobal类也负责和WMS通信

而在此时,有一句关键代码root.setView,这里是将我们的参数,和视图同时交给了ViewRoot,那么这个时候我们来看下ViewRoot当中的setView干了什么

终于在这里让我发现了让我明白的一步

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

在这里我门会看到view.assignParent的设置是this, 那么也就是说在view当中parent其实实际上是ViewRoot

那么在setContentView当中调用了一个setLayoutParams()是调用的ViewRoot的

而在ViewRoot当中发现了setLayoutParams和preformLayout对requestLayout方法的调用

scheduleTraversals 방법 및 액세스 doTraversal 결국 performTraversals ()에 대한 액세스 권한을 가지고 있고,이 호출 scheduleTraversals을 발견하고 내가 전화 무승부의 전 과정을 발견하는 전화 그들 requestLayout에서

차례로 사용되는 현재

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI 렌더링 과정은 안드로이드 엔지니어를 시작할 수 있도록 많은? 제는 읽기 가르 칠 것입니다!

UI는 측정에 가서 다시 그리기 및 장소의 레이아웃의 모든 그릴, 측정하기 위해 완료되면 다음, 장소의 레이아웃을 수행하는 레이아웃입니다.

이 시점에서 전체 UI 렌더링 과정을 우리는 매우 명확했다.

우리는이 추첨의 방법에 따라 사용자 정의 구성 요소를 조작 할 수 있습니다.

BATJ, 바이트 박동 인터뷰 주제, 주제 알고리즘, 하이 엔드 기술 주제, 복합 용도 개발 테마, 자바 인터뷰 주제, 안드로이드, 자바 약간의 지식, 성능 최적화에. .View.OpenCV.NDK 등 스레드, 내 GitHub의에 업로드 된

내 GitHub의 주소를 클릭하십시오https://github.com/Meng997998/AndroidJX 스타 포인트에서 함께 학습

추천

출처blog.51cto.com/14606040/2465682