• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Activity、View、Window三者之间的关系

Activity、View、Window三者之间的关系

作者:Zane 字体:[增加 减小] 来源:互联网 时间:2017-07-23

Zane 通过本文主要向大家介绍了android,源码分析等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

要了解这三者之间的关系,我们带着问题通过分析源码一步一步来揭开它们的神秘面纱!
文章有点长,首先要理解Activity、View、Window,我提出了一些问题,这篇文章可以解答如下问题:
1、为什么要设计Activity、View、Window?
2、Activity工作过程是什么样的?(理解Activity)
3、Window是什么?它的职能是什么?
4、View跟Window有什么联系?
5、Activity、View、Window三者如何关联?

1、为什么要设计Activity、View、Window?

用一句话来联系他们之间的关系:

Activity就像工匠,Window就像是窗户,View就像是窗花,LayoutInflater像剪刀,Xml配置像窗花图纸。
Android根据他们不同的职能让他们各斯其活,同时也相互配合展示给我们灵活、精致的界面。

一张图理清所有层级关系:

好了,接下来一步一步的分析,首先从大家最熟悉的Activity开始:

我们的工匠大神Activity

Activity工作过程:
启动:
从startActivity开始,它会调用到Instrumentation,然后Instrumentation通过Binder向AMS(ActivityManagerService)发请求,通过PIC启动Activity。而这个AIDL操作的方法定义在ApplicationThread中(里面包括了Activity所有的生命周期方法的调用)。然后通过Handle回到主线程启动activity。
因为中间流程太多,详细写出来容易造成“见其树木,而不见其森林”的局面。

启动Activity所执行的操作:
1、从ActivityClientRecord中获取待启动的Activity组件信息
2、通过Instrumentation的newActivity方法使用类加载器创建Activity对象
3、通过LoadedApk的mackApplication方法来尝试创建Application对象(如果Application已经创建,则不会重复创建)
4、创建ContextImpl对象,并通过Activity的attach方法来完成一些重要数据的初始化(包括让Activity跟Window关联)
5、调用Activity的onCreate方法

美丽的窗花View

View如何跟Activity关联起来的?
其实View并不是直接跟Activity关联起来的,而是通过Window这个中间人。如前面所说,View只是窗花,Window才是直接关联到Activity上的。那么:
View如何跟Window关联起来呢?

下面先了解一下Window,就可以理解这个问题了

灵活的窗户Window

Window如何跟Activity关联?
每一个Activity都包含了唯一一个PhoneWindow,这个就是Activity根Window(之所以是说根Window是因为在它上面可以增加更多其他的Window,例如:弹出框(dialog))

那么,PhoneWindow如何跟Activity关联起来的呢?
来个最简单的,setContentView其实就让View与Window关联,Window跟Activity关联起来了。

那setContentView不是View跟Activity关联吗?
真相见Activity源码:

明显是将layout设置到Window上了,那这个 getWindow() 返回的Window是谁呢? 是不是前面提及PhoneWindow?


真的是PhoneWindow,在 attach 的时候执行了PhoneWindow的初始化。
提到了 activity 的 attach 方法,该方法是在执行Activity启动时在ActivityThread里面的performLaunchActivity调用的。performLaunchActivity里面做了很多Activity启动过程具体的操作,例如:主题、记录Activity栈、执行Activity onCreate 方法等。
这么说来setContentView其实就是将View设置到Window上,Activity展示的其实是PhoneWindow上的内容。那么其实 setContentView 实际上是调用的 getWindow().setContentView。

PhoneWindow是个什么东西?它作为Activity跟View的中间人,它做了哪些工作?

首先 PhoneWindow 本身就是一个 Window。

从setContentView来分析:

这里的 mContentParent 其实是一个 ViewGroup。这么看来就简单了。PhoneWindow里面包含了一个ViewGroup,setContentView其实就是将layout设置到了这个ViewGroup上了。

我们再看看这张图:

DecorView是啥?
它直接跟PhoneWindow关联起来的,有了mContentParent,为啥还需要DecorView?
如图所见,DecorView它不仅包含了我们自己的布局,它还包含了titleBar。为啥需要?结构上的需要,更好的管理布局。

Window作为中间人,已经关联了Activity跟View了,那么如果处理Activity跟View之间的关系呢?
是时候揭开Window这个神秘面纱了:
之前提的PhoneWindow是继承于Window的,它是连接Activity跟View之间的桥梁。所有对View的一些操作都需要借助这个桥梁。

为了更好的理解Window,我们先从Dialog入手。在Activity中展示一个对话框的流程是怎样的?
为啥从Dialog入手,因为它里面包含了Window,而且可以直接操作Window里面的View,这样就能了解Window是如何控制View的,以及自定义Window怎么展示到Activity上(因为了解Dialog,就知道怎么让自定义的Window与Activity关联了)

我们省去所有的Dialog build的方法。直接从AlertDialog.show()方法开始:

可见show()方法里面执行了create()方法,继续看create()方法做了什么事:
new 了一个 AlertDialog,那么跟踪它的构造方法看看:

AlertDialog构造方法里面最后执行的是这个构造方法,这里找到了亮点:
1、mWindow是啥?是不是PhoneWindow?
首先AlertDialog是继承Dialog的,mWindow就是Dialog里面初始化的对象,看看是不是PhoneWindow,如果是,那么就可以猜到通过在PhoneWindow添加View就可以在Activity上展示了,因为经过上面分析Activity是跟PhoneWindow有关联的。带着问题继续分析源码:

果然如此,太开心了。

2、AlertController是啥?

从这两个属性就知道了,设置Title、Message的。用过Dialog的人都知道他们是啥,就不多说了。

既然这样关联起来了,那么Window怎么对View操控的呢?

WindowManager是主角。
在Dialog build之后就将View设置进来了,继续追踪Dialog show()这个方法,这个方法会将View与Window相互联系:


因为电脑屏幕大小受限,就截了两个图。
mWindowManager.addView,看到这个方法,可以猜想到WindowManager是个啥玩意了。

从源码注释可看出,WindowManager是对Window进行操作的。它可以做哪些操作?

好了,真相揭晓了。Window对View的操作是通过WindowManager来处理的。WindowManager提供在Window上添加View、移除View、更新View的操作。
然而可见 WindowManager 其实只是一个接口,真正的实现类是WindowManagerImpl
以addView为例,里面有点绕,直接忽略中间过程,最后执行addView的是通过ViewRootImpl完成Window的添加工作的,它执

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android:手把手教你 实现Activity 与 Fragment 相互通信(含Demo)
  • android自定义圆角背景实现富文本标题展示
  • 自定义收集用户行为统计库 (非常方便 可以自己拓展)
  • Android 6.0 Phone"通话显示"查询流程
  • Android缓存处理
  • 自定义进度条PictureProgressBar——从开发到开源发布全过程
  • 详解Android中的SQLite数据库存储
  • Android设备上获取照片、裁剪图片、压缩图片
  • Android触摸事件分发机制完全解析《一》
  • Android-SQLite和SQLiteOpenHelper

相关文章

  • 2017-05-26将Android系统源码导入Android studio的方法,androidstudio
  • 2017-05-26Android的Kotlin秘方(I):OnGlobalLayoutListener,
  • 2017-05-26创建安卓应用的 30 个经验教训,安卓经验教训
  • 2017-05-26关于Android项目隐藏标题栏的方法总结,android标题栏
  • 2017-05-26Android开发9:网络访问&Web服务开发,android开发9访问
  • 2017-05-26getDrawingCache()和Android中的截图方法简介
  • 2017-05-26Android端 配置极光推送
  • 2017-05-26二维码Zxing&Zbar,zxing
  • 2017-05-26git+coding.net记录篇,gitcoding.net记录
  • 2017-05-26安卓界面高级组件------拖动条和评星条,安卓------拖动

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android View的绘制流程,androidview绘制
    • Android官方开发文档Training系列课程中文版:数据存储之文件存储
    • androidj基础:从网上下载图片,
    • LinearLayout嵌套,linearlayout
    • svn环境搭建(不同目录、设置不同的权限)
    • Android 系统常用的权限,android权限
    • Android-BroadcastReceiver详解
    • 【React Native开发】React Native控件之ViewPagerAndroid讲解以及美团首页顶部效果实例(17)
    • Android开发必看-快速提高 Android 开发效率的 Web 工具,android必看
    • 再见NullPointerException。在Kotlin里null的处理(KAD 19),kotlinnull

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有