android分析windowManager、window、viewGroup之间关系(一)

本文详细解析了Android中视图添加的过程,从View、ViewGroup到WindowManager的实现原理,重点介绍了addView方法的流程及关键参数windowManager.LayoutParams的作用。

出处:http://www.cnblogs.com/xilinch/p/3361665.html点击打开链接


本文将主要介绍addview方法,在windowManager、window、viewGroup中的实现原理。首先将介绍这些类结构关系,然后分析其内在联系,介绍实现原理,最后介绍重要的一个参数windowManager.layoutParams。

文章预计分为三个部分。

 

  一、首先介绍一下上述接口、类的结构

  接口:windowManager

    用来在应用与window之间的管理接口,管理窗口顺序,消息等

public interface WindowManager extends android.view.ViewManager

     抽象类:window

    定义窗口样式和行为的抽象基类,用于作为顶层的view加到windowManager中。

    唯一实现了这个抽象类的是PhoneWindow,实例化PhoneWindow需要一个窗口

    public abstract class Window

    其中有一个很重要的内部类

    private class LocalWindowManager extends WindowManagerImpl.CompatModeWrapper{...};

  

  抽象类:viewGroup

    包含其他view的容器,layouts和view 容器的基类。

    public abstract class ViewGroup extends View implements ViewParent, ViewManager

  

  相关接口:ViewParent

        定义了一个view parent 的要负责的功能以及view和parent view之间的关联

    public interface ViewParent {

         public void requestLayout();

        public void createContextMenu(ContextMenu menu);

        public void bringChildToFront(View child);

        .....

    }

    viewManager

      用来添加和移除activity中的view的接口

public interface ViewManager
{
    public void addView(View view, ViewGroup.LayoutParams params);
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);
    public void removeView(View view);
}

 

二.他们之间的内在关系。

  1. 对于view来说,添加到viewGroup中是通过addView();方式来实现的,在addView中实际上使用的是:

            addViewInner(child, index, params, false);

           流程是: 1.首先是对子View是否已经包含到一个父容器中

                2.对子View布局参数的处理

                3.调用addInArray来添加View

                4.设置父View为当前的ViewGroup

                5.焦点的处理

                6.当前View的AttachInfo信息

                7.View树改变的监听

                8.子View中的mViewFlags的设置

                             主要是通过    addInArray添加view,添加的实现为system.arrayCopy(....);

  

  2. 对于viewGroup来说,都会显示在在一个窗口中,每个都有一个父节点mParent,,最顶上的节点也是一个viewGroup,也就是decorView。

  对于每个activity只有一个decorView也就是ViewRoot,只有一个window,window的获取是通过下面方法获取的。

1
Window mWindow = PolicyManager.makeNewWindow( this );

  在activity中使用setContentView(),其实是使用了 window.setContentView()完成的,window.setcontentView,

  还是通过LocalWindowManager.addView(view, params)来实现的。这里LocalWindowManager是实现了WindowManagerImpl.CompatModeWrapper

  ,本质上就是WindowManager、viewManager接口中的addvidew方法。

  

  3.  对于windowManager来说一个系统只有一个,它是由系统底层实现的,用于负责调度当前显示那个窗口,消息处理我们获得一个windowManager的方式如下:

  

1
2
3
WindowManager windowManager = (WindowManager)context().getSystemService(
                                     Context.WINDOW_SERVICE);

  这里windowManager其实是一个接口,而通过getSystemService的方式。通过这个方式可以获取很多的系统服务,比如电话、闹钟、电源管理等等。

  同时windowManager和几个类之间的内在联系如下:

打开下面链接,直接免费下载资源: https://renmaiwang.cn/s/9cdpp SSLspeedy4InstallOnly是款专为Google Chrome浏览器开发的功能强大的扩展程序。其核心作用在于提升HTTPS通信的速度效率,通过优化SSL连接的建立流程和减少不必要的延迟时间来实现这目标。作为项安全且稳定的网络协议,SSL(Secure Sockets Layer)在保障数据传输安全性方面发挥着关键作用,尤其适用于处理包含敏感信息的在线操作。 该插件的工作原理涉及系列复杂的通信步骤:首先需要进行证书验证,随后完成双方的公钥交换,并最终达成协议版本的致性。这些流程如果出现任何延误或处理不当,都可能对网页加载速度产生不利影响。SSLspeedy4正是针对这问题进行了优化设计。 在安装SSLspeedy4之前,请确保您已启用Chrome浏览器的开发者模式。由于该插件采用“InstallOnly”版本策略,即不通过官方应用商店自动安装,而是需要手动完成解压和加载操作。具体步骤包括:下载并解压包含完整安装信息的压缩包文件;进入Chrome扩展管理页面(chrome://extensions/),启用开发者模式;最后选择预解压目录进行加载。 值得注意的是,尽管SSLspeedy4声称能够显著提升HTTPS连接的速度表现,但实际效果可能会受到网络环境、服务器配置以及浏览器版本等多种因素的影响。此外,在安装第三方插件时务必仔细审查其权限请求列表,并确保与现有安全策略相容。对于企业用户而言,还需考虑该插件与其他内部系统或流程的兼容性问题。 标签“chrome SSLspe”旨在为读者提供更清晰的内容分类:其中,“chrome”专指Google Chrome浏览器这全球最受欢迎且功能强大的产品;“SSlspe”则简写代表SSLspeed4的核心功能。文件名“S
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值