博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 之 Window、WindowManager 与窗口管理
阅读量:5905 次
发布时间:2019-06-19

本文共 2944 字,大约阅读时间需要 9 分钟。

其实在android中真正展示给用户的是window和view,activity在android中所其的作用主要是处理一些逻辑问题,比如生命周期的管理、建立窗口等。在android中,窗口的管理还是比较重要的一块,因为他直接负责把内容展示给用户,并和用户进行交互。响应用户的输入等。

在讲窗口管理时,有必要先说下ViewManager这个接口,这个接口主要有以下的实现子接口和实现类,分别是:WindowManager和ViewGroup里面还有三个重要的方法:

      * addView(); 

     * updateViewLayout();

     * removeView();

在WindowManager中,addView方法表示的是将主窗口中的顶级view(也就是DecorView)添加到WindowManager中,并建立会话。接下来会详细介绍。我们先来看看Window

Window:

Windowandroid中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类,PhoneWindowMidWindow,我们一般的activity对应的主要是PhoneWindow,在activity中经常使用的setContentView等方法也是在这个里面实现的。

    @Override

    public void setContentView(View view,ViewGroup.LayoutParams params) {

        if (mContentParent == null) {

            installDecor();

        } else {

            mContentParent.removeAllViews();

        }

        mContentParent.addView(view, params);

        final Callback cb = getCallback();

        if (cb != null) {

           cb.onContentChanged();  //窗口类容发生变化时更新

        }

    }

 每个主窗口中都有一个View,称之为DecorView,是主窗口中的顶级view(实际上就是ViewGroup),在View中有两个成员变量叫做mParent、mChildren,它是用来管理view的上下级关系的。而ViewGroup是对一组View的管理。因此,在ViewGroup中建立了所有view的关系网。而最终ViewGroup附属在主窗口上。这样就很容易在窗口中通过findViewById找到具体的View了。view中的事件处理也是根据这个路径来处理的。

我们再来看看ActivityThead中的两个重要的方法(至于ActivityThead将在一篇中详细介绍):

           performLaunchActivity( );

            handleResumeActivity( );

在performLaunchActivity中,会调用activity.attach方法建立一个window, 在handleResumeActivity方法中启动activity的时候,会将主窗口加入到WindowManager中

             View decor =r.window.getDecorView();  //获得窗口的顶级View

      decor.setVisibility(View.INVISIBLE);

      ViewManager wm= a.getWindowManager();    //WindowManager继承自ViewManager

      WindowManager.LayoutParams l =r.window.getAttributes();

      a.mDecor = decor;

      l.type =WindowManager.LayoutParams.TYPE_BASE_APPLICATION;

     l.softInputMode |= forwardBit;

     if (a.mVisibleFromClient) {

         a.mWindowAdded = true;

         wm.addView(decor, l);  //实际上是把主窗口的顶级view加入到WindowMangaer

      }

我们再来看看WindowManager。

WindowManager:

WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。

通过Context.getSystemService(Context.WINDOW_SERVICE)的方式可以获得WindowManager的实例.

WindowManager继承自ViewManager,里面涉及到窗口管理的三个重要方法,分别是:

     * addView(); 

     * updateViewLayout();

     * removeView();  

WindowManager中还有一个重要的静态类LayoutParams.通过它可以设置和获得当前窗口的一些属性。

我们先来看看addView()方法,在addView中,会利用LayoutParams获得window的View属性,并为每个window创建ViewRoot,ViewRoot是View和WindowManager之间的桥梁,真正把View传递给WindowManager的是通过ViewRoot的setView()方法,ViewRoot实现了View和WindowManager之间的消息传递。在将主窗口添加到WindowManger时,它首先会建立一个代理对象:

              wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE)

并且打开会话(IWindowSession),之后Window将通过该会话与WindowManager建立联系,

来看下setView方法:

         try {

        res =sWindowSession.add(mWindow, mWindowAttributes,

         getHostVisibility(), mAttachInfo.mContentInsets);

     } catch (RemoteException e) {

         mAdded = false;

        mView = null;

         mAttachInfo.mRootView =null;

         unscheduleTraversals();

         throw newRuntimeException("Adding window failed", e);

      } finally {

         if (restore) {

            attrs.restore();

         }

      }

在这段代码中,ViewRoot通过IWindowSession把窗口添加到WindowManager中。ViewRoot继承了Handler,实际上它的本质就是一个Handler,窗口中View的事件处理、消息发送、回调等将通过ViewRoot来处理。

这样就完成了把窗口添加到WindowManager中,并交由WindowManager来管理窗口的view、事件、消息收集处理等。

转载地址:http://yrdpx.baihongyu.com/

你可能感兴趣的文章
2016-2-10 tomcat基础学习
查看>>
Java GC基础
查看>>
iOS-Model-View-ViewModel & ReactiveCocoa
查看>>
Node.js大众点评爬虫
查看>>
使用 IDEA和Maven 整合SSH框架
查看>>
about data type in c#
查看>>
HDU 5311 Hidden String
查看>>
日语表示"原因"的多种形式
查看>>
9. Palindrome Number
查看>>
BMFont制作美术字体
查看>>
逆向思维----魔兽世界封包分析(2)
查看>>
mongodb的基本概念 学习笔记(二)
查看>>
JSON 的一些知识
查看>>
Python3处理HTTPS请求 SSL证书验证
查看>>
【python3】酷狗音乐及评论回复下载
查看>>
利用jion阻塞主进程结束
查看>>
好公司 烂公司
查看>>
C# 创建、部署和调用WebService的简单示例
查看>>
XOJ测试 2016.5.22
查看>>
hashlib模块configparser模块logging模块
查看>>