当前位置: 首页 > news >正文

怎样做读书会网站什么网站可以做外单

怎样做读书会网站,什么网站可以做外单,产品网站设计理念,谷歌推广外贸建站对于一个 Android 工程师来讲#xff0c;或多或少都听说过 Window 的概念#xff0c;并且隐约感受到它在 Activity 和 View 之间应该发挥着某种连接的作用。但如果要说出这三者之间的关系#xff0c;多数 android 工程师都不知道从何下手。 Activity 的 setContentView Ac…对于一个 Android 工程师来讲或多或少都听说过 Window 的概念并且隐约感受到它在 Activity 和 View 之间应该发挥着某种连接的作用。但如果要说出这三者之间的关系多数 android 工程师都不知道从何下手。 Activity 的 setContentView Activity 是 Android 开发人员使用最频繁的 API 之一。最初在接触 Android 开发时很多人都会认为它是负责将 layout 布局中的控件渲染绘制出来的。原因很简单因为我们认为 想显示一个新的界面时都是通过 start 一个新的 Activity 方式 想显示的内容或者布局只需要在 Activity 中添加一行 setContentView。 剩下的 Activity 都自动的帮我们搞定。但是从来没有去创建一个 window 来绑定 UI 或者 View 元素。 点开 setContentView 的源码如下 可以看出Activity 几乎什么都没有做将操作直接交给了一个 window 来处理。getWindow 返回的是 Activity 中的全局遍历 mWindow它是 Window 窗口类型。那么这个 mWindow 是什么时候赋值的呢 在 startActivity 的过程中最终代码会调用到 ActivityThread 中的 performLaunchActivity 方法通过反射创建 Activity 对象并执行其 attach 方法。Window 就是在这个方法中被创建 在 attach 方法中将 mWindow 初始化为一个 PhoneWindow 类型。实际上整个 Android 系统中Window 只有一个实现类 PhoneWindow。 接下来调用 setWindowManager 方法将系统 WindowManager 传给 PhoneWindow 最终在 PhoneWindow 中持有了一个 WindowManagerImpl 的引用。 PhoneWindow 的 setContentView Activity 将 setContentView 的操作交给了 PhoneWindow看一下其实现过程 图中1处调用如果 mContentParent 为 null则调用 installDecor() 初始化 DecorView 和 mContentParent图中2处将我们调用的 setContentView 传入的布局添加到 mContentParent 中 可以看出在 PhoneWindow 中默认有一个 DecorView实际上是一个 FrameLayout。在 decorView 中默认自带一个 mContentParent实际上是一个 ViewGroup。我们自己实现的布局是被添加到 mContentParent 中的。因此经过 setContentView 之后PhoneWindow 内部的 View 关系如下图所示 目前为止PhoneWindow 中只是创建了一个 DecorView并在 DecorView 中添加了我们在 Activity 中传入的 layout 布局。但此时DecorView 还没有与 Activity 建立任何联系也没有被绘制到界面显示那么 DecorView 是何时被绘制到屏幕上的呢 刚接触 Android 学习生命周期时经常会看到相关文档 Activity 执行到 onCreate() 时 Activity 的内容还并不可见只有执行完 onResume() 之后Activity 中的内容才是屏幕可见状态。造成这种现象的原因是 onCreate 阶段只是初始化了 Activity 需要显示的内容onResume 阶段会将 PhoneWindow 中的 DecorView 真正的绘制到屏幕上。 在 Activity 的 handleResumeActivity 中会调用 WindowManager 的 addView 方法将 DecorView 添加到 WMS 上如下代码所示 WindowManager 的 addView 结果 DecorView 被渲染绘制到屏幕上显示 DecorView 可以接收屏幕触摸事件。 WindowManager 的 addView PhoneWindow 只是负责处理一些应用窗口通用的逻辑设置标题栏、导航栏等。但真正完成把一个 View 作为窗口添加到 WMS 的过程是由 WindowManager 来完成的。WindowManger 是接口类型它的真正实现是 WindowManagerImpl 类。它的 addView 方法如下 WindowManagerImpl 也是一个空壳它调用了 WindowManagerGlobal 的 addView 方法。 WindowManagerGlobal 是一个单例每一个进程中只有一个实例对象如上图红框中所示。在其 addView 方法中创建了一个最关键的 ViewRootImpl 对象然后通过 ViewRootImpl 的 setView 方法将 View 添加到 WMS 中。 ViewRootImpl 的 setView 图中1处的 requestLayout 是刷新布局的操作调用此方法后 ViewGroup 所关联的 View 也执行 measure、layout、draw 等操作。确保 view 被添加到 Window 上显示到屏幕之前已经测量和绘制操作。图中2处调用 mWindowSession 的 addToDisplay 方法将 View 添加到 WMS 中。mWindowSession 是 WindowManagerGlobal 中的单例对象初始化代码如下 sWindowSession 实际上是 IWindowSession 类型是一个 Binder 类型。真正的实现类是 System 中的 Session 。图中中红框中的内容就是用 AIDL 获取 System 进程中的 Session 对象。即 addToDisplay 代码如下 图中的 mService 就是 WMS。至此Window 已经成功的被传递给了 WMS剩下的工作就全部转移到系统中的进程 WMS 来完成最终的添加操作。 上面我们提到 addView 成功的另一个标志就是能够接收触屏事件。通过对 setContentView 的流程分析可以看出添加 View 的操作实质上是 PhoneWindow 在全盘操作背后负责人是 WMS。反之Activity 至始至终没有什么参与感。但是当触屏事件发生之后 Touch 事件首先被传入到 Activity然后被下发到布局中的 ViewGroup 或者 View。那么 touch 事件是如何传递到 Activity 上的呢 ViewRootImpl 中的 setView 方法除了调用 IWindowSession 执行跨进程添加 View 之外。还有一项重要的操作就是设置输入事件的处理。 上图红框中设置了一系列的输入通道。一个触屏事件的发生是由屏幕发起然后经过驱动层一系列的优化计算通过 socket 跨进程通知 Android 的 Framework 层实际上就是 WMS。最终屏幕的触摸事件被发送到上面的输入管道中。 这些输入管道实际上是一个链表结构。当某一个屏幕触摸事件到达其中的 ViewPostImeInputStage时会经过 onProcess 来处理如下所示 可以看到在 onProcess() 方法中最终调用了一个 mView 的 dispatchPointerEvent() 方法mView 就是 PhoneWindow 中的 DecorView。而 dispatchPointerEvent 是被 View.java 实现的 最终调用了 PhoneWindow 中的 callback.dispatchTouchEvent() 方法。那这个 callback 是不是 Activity 呢 在启动 Activity 阶段创建 Activity 对象并调用 attach 方法时有如下一段代码 果然将 Activity 自身传递给了 PhoneWindow。 Activity 的 dispatchTouchEvent 方法 touch 事件只是在 Activity 中绕了一圈最终还是回到了 PhoneWindow 中的 DecorView 来处理。剩下的就是从 DecorView 开始将事件层层传递给子 View 中了。 总结 通过setContentView的流程分析了Activity、Window和 View 之间的关系。整个过程Activity表面上参与度比较低大部分View的添加操作都被封装到Window中实现。Activity能够更简单的实现Window和View的操作逻辑。 整个流程需要注意 1. 一个 Activity 中有一个 Window也就是 PhoneWindow 对象。在 PhoneWindow 中有一个 DecorView在 setContentView 中会将 layout 填充到此 DecorView 中。 2. 一个应用程序中只有一个 WindowManagerGlobal对象因为在 ViewRootImpl 中它是 static 静态类型。 3. 每一个 PhoneWindow 对应一个 ViewRootImplement 对象。 4. WindowManagerGlobal 通过调用 ViewRootImpl 的 setView 方法完成 window 的添加过程。 5. ViewRootImpl 的 setView 方法中主要完成两件事情View渲染(requestLayout)以及接收触摸事件。
http://wiki.neutronadmin.com/news/265358/

相关文章:

  • 会展相关网站建设柳州市建设中心网站首页
  • seo包括网站建设吗福建厦门网站建设公司
  • 建设一个旅游网站网络营销心得体会
  • 网站建设项目的工期计划英文网站建设合同
  • 大眼睛网站建设html个人博客完整代码
  • 大企业网站建设方案中国互联网前100名企业
  • 上海哪里有做网站的软件开发需要学什么知识
  • dede多个网站怎么做怎样在百度上做推广网站
  • 潍坊网站制作在线网站所有者是什么意思
  • 免费制作永久网站医院网站主页面设计
  • 大图网 网站网站上传百度多久收录
  • 广州企业网站建设公司哪家好施工企业项目负责人现场带班时间
  • 青岛手机网站建设包头市做网站公司
  • 三只松鼠电商网站建设利用wordpress实现分类筛选
  • 深圳国贸网站建设网站的推广方法
  • 网站费用多少空间印象商业空间设计
  • 天助网站个人工商查询官网入口查询
  • 西安城乡建设网站制作网站谁家做的好
  • 像优酷这样的网站需要怎么做棒的网页设计
  • 湖北移动网站建设网站开发网络课程
  • 网站首屏最好的医疗网站建设
  • 网站是怎么制作出来的大航母网站建设怎么样
  • 做的网站加载太慢怎么办医联体网站建设
  • 学校网站设计实验报告html5移动网站制作
  • 移动网站建设是什么意思做消费金融网站
  • 关于电子商务网站建设的论文自建站怎么接入支付
  • 模特公司网站模板怎么上传网站到ftp
  • seo网站是什么外贸自建站的推广方式
  • 安徽湖滨建设集团网站数字展厅网站建设
  • 定制网站的优势竞价推广开户电话