当前位置:  编程技术>其它
本页文章导读:
    ▪Android GWES之窗口管理之基本构架原理       Android的窗口管理是C/S模式的。Android中的Window是表示Top Level等顶级窗口的概念。DecorView是Window的Top-Level View,这个View我称之为主View,DecorView会缺省的attach到Activity的主窗口中。主View被.........
    ▪由AlertDialog想到的PhoneWindow, Dialog的覆盖问题       在同一个窗口中,可以同时有多个AlertDialog,但是他们之间相互覆盖,最后show()的那个在最上面,Why? 代码如下: ......
    ▪PhoneWindow,ViewRoot,Activity之间的大致关系      在android里,我们都知道activity.但是一个activity跟一个Window是一个什么关系呢? 在activity.java中,我们可以看到两个变量,分别是: private Window mWindow; private WindowManager mWindowManager; 这这个变量.........

[1]Android GWES之窗口管理之基本构架原理
    来源:    发布时间: 2013-11-15

Android的窗口管理是C/S模式的。Android中的Window是表示Top Level等顶级窗口的概念。DecorView是Window的Top-Level View,这个View我称之为主View,DecorView会缺省的attach到Activity的主窗口中。主View被加入到WindowManager中,WM使用WindowState与这个主View对应。

 


 

       Activity建立一个主窗口后,在将主窗口添加到WindowManager时,首先要建立WindowManager代理对象,并打开一个会话(实现IWindowSession AIDL接口),并维持该会话。Activity将通过该会话与WindowManager建立联系,这个Session是C/S体系的基础,Client通过WindowSession将window加入到Window Manager中。一个完整的窗口概念横跨了View,ViewRoot,WindowManager Service。Window,DecorView,View,IWindow ,ISession,WindowState之间的关系如下:

 

 

 

 

 

客户端的Activity通过Session会话与WindowManager建立对话,而WindowManager则通过IWindow接口访问Client,将消息传递到Client端,通过消息分发渠道,将消息传递到处理函数OnXXX。

 



大龙 2013-01-13 04:12 发表评论

    
[2]由AlertDialog想到的PhoneWindow, Dialog的覆盖问题
    来源:    发布时间: 2013-11-15

在同一个窗口中,可以同时有多个AlertDialog,但是他们之间相互覆盖,最后show()的那个在最上面,Why?

代码如下:

[java] view plaincopy
  • public void show() {  
  •       if (mShowing) {  
  •           if (mDecor != null) {  
  •               mDecor.setVisibility(View.VISIBLE);  
  •           }  
  •           return;  
  •       }  
  •   
  •       if (!mCreated) {  
  •           dispatchOnCreate(null);  
  •       }  
  •   
  •       onStart();  
  •       mDecor = mWindow.getDecorView();  
  •       WindowManager.LayoutParams l = mWindow.getAttributes();  
  •       if ((l.softInputMode  
  •               & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {  
  •           WindowManager.LayoutParams nl = new WindowManager.LayoutParams();  
  •           nl.copyFrom(l);  
  •           nl.softInputMode |=  
  •                   WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;  
  •           l = nl;  
  •       }  
  •   
  •       try {  
  •           mWindowManager.addView(mDecor, l);  
  •           mShowing = true;  
  •     
  •           sendShowMessage();  
  •       } finally {  
  •       }  
  •   }  
  • 其中 mWindow 是在 构造函数 public Dialog(Context context, int theme) 中初始化 :

    Window w = PolicyManager.makeNewWindow(mContext); 

     mWindow = w;

    由此,在上面的show()代码中,将从mWindow中的decorView加入到 原窗口中,覆盖了原窗口中的decorView的显示。

    本程序中,最后的显示的窗口中,具有3个decorView(两个存放Dialog, 一个存放原布局):mWindowManager - > mWindowManager - > mViews 



    ========================================================================================================================


    在Hierarchy Viewer中,原先的窗口显示的布局是:


    其布局无关精要,主要有一个TextView,一个Spinner,一个 Button

    show了AlertDialog之后,其布局为:

    不难看出,原decorView被覆盖了,显示的是第二个Dialog



    大龙 2013-01-13 04:03 发表评论

        
    [3]PhoneWindow,ViewRoot,Activity之间的大致关系
        来源:    发布时间: 2013-11-15
    在android里,我们都知道activity.但是一个activity跟一个Window是一个什么关系呢?

    在activity.java中,我们可以看到两个变量,分别是:

    private Window mWindow;

    private WindowManager mWindowManager;

    这这个变量是在哪里赋值的呢?可以看到attach函数,

    mWindow = PolicyManager.makeNewWindow(this);

    跟进去看一下,可以发现返回的时候一个PhoneWindow对象,PhoneWindow是Window类的派生类。

    mWindow.setWindowManager(null, mToken, mComponent.flattenToString());

    if (mParent != null) {

    mWindow.setContainer(mParent.getWindow());

    }

    mWindowManager = mWindow.getWindowManager();

    仔细跟踪下这段代码中我们可以得到WindowManager对象,并且这个对象是在系统唯一的,这个对象同样被赋值给PhoneWindow的成员变量。

    我们在新建一个activity的时候,往往喜欢用如下的代码来定义该activity的UI界面,那么这个具体的实现是怎么来实现的呢?

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    我们跟踪setContentView就知道了。可以发现activity其实把这个操作交给了自己的mWindow来完成,通过跟踪PhoneWindow

        
    最新技术文章:
    ▪修改月光博客网站中PHP常用正则表达式中出现...
    ▪js正则判断非法字符限制输入
    ▪通过正则表达式删除空行的方法
    ▪一个好用的正则匹配电话号手机号邮箱网址的...
    ▪JS 正则表达式用法介绍
    ▪几个小例子教你如何实现正则表达式highlight高...
    ▪如何实现正则表达式的JavaScript的代码高亮
    ▪js 玩转正则表达式之语法高亮
    ▪PHP中过滤常用标签的正则表达式
    ▪js 正则表达式学习笔记之匹配字符串
    ▪使用正则表达式匹配[***]样式的字符串
    ▪史上最详细的js日期正则表达式分享
    ▪php+正则将字符串中的字母数字和中文分割
    ▪正则表达式不区分大小写以及解决思路的探索...
    ▪正则替换换行符和把 br 替换成换行符
    ▪正则表达式匹配不包含某些字符串的技巧
    ▪匹配form表单中所有内容的正则表达式
    ▪正则表达式(括号)、[中括号]、{大括号}的区别...
    ▪正则表达式中的"g"是什么意思附件参数g的用...
    ▪浅谈正则表达式(Regular Expression)
    ▪Python正则表达式的七个使用范例详解
    ▪正则表达式提取img的src
    ▪常用的正则表达式集锦
    ▪使用正则表达式找出不包含特定字符串的条目...
    ▪js正则表达式中的问号几种用法小结
    ▪正则表达式概述 什么是正则表达式 .
    ▪ajax对注册名进行验证检测是否存在于数据库...
    ▪js正则解析URL参数示例代码
    ▪JS使用正则去除字符串最后的逗号
    ▪几种常见攻击的正则表达式
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3