一、简述如何将Activity展现在手机上

Tips:

Activity本身是没办法处理显示什么控件(view)的,是通过PhoneWindow进行显示的

换句话说:activity就是在造PhoneWindow,显示的那些view都交给了PhoneWindow处理显示

1、在Activity创建时调用attach方法:

2、attach方法中会调用PolicyManager.makeNewWindow()

实际工作的是IPolicy接口的makeNewWindow方法

①、其中创建了一个window(可以比喻为一个房子上造了一个窗户):mWindow = PolicyManager.makeNewWindow(this);

②、在window这个类中,才调用了setContentView(),这是最终的调用

在Activity的setContentView方法中,实际上是调用:getWindow().setContentView(view, params);

这里的getWindow()就是获取到一个Window对象

Tips:

为啥attch优先于onCreate调用,就是由于在attch方法中,会创建window,有了window才能调用setContentView

3、在IPolicy的实现类中创建了PhoneWindow:

①、由mWindow = PolicyManager.makeNewWindow(this);,

②、这里的makeNewWindow(this);方法中,返回的是:return sPolicy.makeNewWindow(context);

③、这个sPolicy实际是一个接口,其实现类是Policy,其中只是创建了一个PhoneWindow

4、在PhoneWindow的setContentView中向ViewGroup(root)中添加了需要显示的内容

①、PhoneWindow是继承Window的

②、setContentView这个方法中,需要先判断一个mContentParent是否为空,因为在默认进来的时候,什么都没创建呢

此时需要创建:installDecor(),DecorView是最根上的显示的

可以通过adt中的的tools中有个hierarchyviewer.bat的工具,可以查看手机的结构

③、DecorView:是继承与FrameLayout的,作为parent存在,最初显示的

④、下次再加载的时候,mContentParent就不为空了,会将其中的所有的view移除掉,然后在通过布局填充器加载布局

二、三者关系:

1、在Activity中调用attach,创建了一个Window

2、创建的window是其子类PhoneWindow,在attach中创建PhoneWindow

3、在Activity中调用setContentView(R.layout.xxx)

4、其中实际上是调用的getWindow().setContentView()

5、调用PhoneWindow中的setContentView方法

6、创建ParentView:

作为ViewGroup的子类,实际是创建的DecorView(作为FramLayout的子类)

7、将指定的R.layout.xxx进行填充

通过布局填充器进行填充【其中的parent指的就是DecorView】

8、调用到ViewGroup

9、调用ViewGroup的removeAllView(),先将所有的view移除掉

10、添加新的view:addView()

Tips:

①、Activity就是在造“窗户”,即创建PhoneWindow

②、PhoneWindow才是进行显示view的操作,主要就是setContentView()

Activity、Window和View三者间的关系有一定的见解的更多相关文章

  1. pg_hba.conf、pool_hba.conf 以及 pool_passwd 三者间的关系

    pg_hba.conf.pool_hba.conf 以及 pool_passwd 三者间的关系: 1.pg_hba.conf.pool_hba.conf 以及 pool_passwd 三者关系 pg_ ...

  2. JDK与JRE、JVM三者间的关系及JDK的安装部署

    JDK与JRE.JVM三者间的关系及JDK的安装部署 一.JDK与JRE.JVM三者间的关系 JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了 ...

  3. Activity、Window、View三者之间的联系

    Activity类:Android四大组件之一,是开发者最常用的一个组件 Window类:是一个抽象类,具有窗口管理的功能,实现类为PhoneWindow View类:提供对View的操作,包括绘制测 ...

  4. Android 中Activity,Window和View之间的关系

    转自:http://hi.baidu.com/xiaofanqing/blog/item/8261ac114ab14f64cb80c435.html 我这里根据我个人的理解来讲讲我个人对这3个概念的理 ...

  5. 连接池、数据源、JNDI三者间的关系及用法

    连接池:连接池是由容器(比如Tomcat)提供的,用来管理池中的连接对象.连接池自动分配连接对象并对闲置的连接进行回收.连接池中的连接对象是由数据源(DataSource)创建的.连接池(Connec ...

  6. JDK、JVM和JRE三者间的关系,及JDK安装路径下的文件夹说明

    JDK的全称是Java SE Development Kit, 即Java标准开发包,是Sun公司提供的一套用于开发Java应用程序的开发包, 它提供了编译.运行Java查询所需的各种工具和资源,包括 ...

  7. JDK、JRE、JVM三者间的关系

    JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库.Java Runtime Enviro ...

  8. 区分.net、c#、asp.net三者间的关系

    1..net(dot net) .net是一个平台,抽象的平台概念. 实现形式是库:①定义了基本的类型(通用类型系统CTS,common type system).   ②包含.net公共语言运行库( ...

  9. JDK、JRE、JVM三者间的关系(待更新...)

    JDK(Java Development Kit) JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jv ...

随机推荐

  1. python 读取文件、并以十六进制的方式写入到新文件

    #!/usr/bin/env python infile = file("in.mp3","rb") outfile = file("out.txt& ...

  2. JavaScript高级 面向对象(6)--值类型与引用类型的存储特征

    说明(2017.3.31): 1. 画图: var num = 123; var num2 = num; 值类型赋值的存储特点:将变量num内的数据全部拷贝一份,存储给新的变量num2,内存中有2个数 ...

  3. iOS拦截导航栏返回按钮事件的正确方式(二)

    当我们使用了系统的导航栏时,默认点击返回按钮是 pop 回上一个界面.但是在有时候,我们需要在点击导航栏的返回按钮时不一定要 pop 回上一界面,比如一个视频播放界面,进入横屏后,默认点击返回按钮仍然 ...

  4. 贪心算法or背包问题

    贪心方法:总是对当前的问题作最好的选择,也就是局部寻优.最后得到整体最优. 应用:1:该问题可以通过“局部寻优”逐步过渡到“整体最优”.贪心选择性质与“动态规划”的主要差别. 2:最优子结构性质:某个 ...

  5. uart 超声波传感器数据读取

    传感器选择 淘宝上搜索 US-100 , 价格大概在17块人民币左右. 读取数据的代码如下: // include/aplex_tty.h #ifndef _APLEX_TTY_H__ #define ...

  6. JAVA里使用CKEditor和CKFinder的配置

    在JSP里使用CKEditor和CKFinder的配置 CKEditor的编辑器工具栏中有一项“图片域”,该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. “预览”中有一大堆鸟语,看 ...

  7. Tomcat (1) —— Mac下配置Tomcat Https/SSL

    Tomcat (1) -- Mac下配置Tomcat Https/SSL tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 参考来源: SSL/TLS Config ...

  8. 【Hibernate步步为营】--核心对象+持久对象全析(二)

    上篇文章讨论了Hibernate的核心对象,在开发过程中经经常使用到的有JTA.SessionFactory.Session.JDBC,当中SessionFactory可以看做数据库的镜像,使用它可以 ...

  9. 『Golang』Martini框架入门

    本文介绍golang中的优秀web开发框架martini! 序 Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架.Martini是一个专门用来处理Web ...

  10. larave框架的安装

    (1)中文官网:http://www.golaravel.com/ (2)composer下载与安装 1:composer网址:getcomposer.org 2:windows下载Composer- ...