源码探索系列13---Window的PhoneWindow与WindowManager

一文搞懂WindowPhoneWindow、DercorView、WindowManage 通过本文您可以了解PhoneWindowWindow,DecorView,WindowManagerWindowManagerImpl,WindowManagerGlobal这些类及它们的作用 阅读详情

关于Window,PhoneWindow和WindowManager三者的关系是:

Window是一个抽象类,他的具体实现是PhoneWindow
我们通过WindowManager来管理Window。

我们的所有的界面,例如Activity,Toast,Dialog等都是靠Window来呈现,因此他是View的管理者咯。

很久前用过他的一个功能就是拿来做消息提醒,当有用户发来特定消息时候,就跑出来一个小悬浮窗来提示用户。现在看得多的就是各种管家关于内存的提示!这真的很让人纠结的安卓机啊!特别是某米的手机,当年发现他不支持这个功能!搞到得单独为他开发一个别的方式….

好了,说这么多,我们该从哪里开始说起呢?

起航

API:23

我们先挑WindowManager 开始吧。

public interface WindowManager extends ViewManager 

我们的WiddowManger是一个接口,不是实际干活的人,看下他继承的ViewManager

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

定义了我们使用到的三个操作。增加,更新,移除。
那么背后到底谁在干活呢,是WindowManagerImpl
不过很有意思的是,他也是一个壳,实际干活的都交给了WindowManagerGlobal去干了。

public final class WindowManagerImpl implements WindowManager {
private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();

    @Override
    public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
        applyDefaultToken(params);
        mGlobal.addView(view, params, mDisplay, mParentWindow);
    }
    @Override
    public void removeView(View view) {
         mGlobal.removeView(view, false);
    }

    @Override
    public void updateViewLayout(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
        applyDefaultToken(params);
        mGlobal.updateViewLayout(view, params);
    }
    ...
}

addView

我们继续跟下,看在addView背后做了什么

public void addView(View view, ViewGroup.LayoutParams params,
        Display display, Window parentWindow) {

     ... 

    final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams) params;
    ViewRootImpl root;
    View panelParentView = null;
    synchronized (mLock) {

        ...

        root = new ViewRootImpl(view.getContext(), display);

        view.setLayoutParams(wparams);

        mViews.add(view);
        mRoots.add(root);
        mParams.add(wparams);
    }
    // do this last because it fires off messages to start doing things
    try {
        root.setView(view, wparams, panelParentView);
    } catch (RuntimeException e) {
        ...
    }
}

private final ArrayList<View> mViews = new ArrayList<View>();
private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
private final ArrayList<WindowManager.LayoutParams> mParams =
        new ArrayList<WindowManager.LayoutParams>();

我们看到他主要是创建了新的ViewRootImpl,然后将View,ViewRootImpl和params保存起来,最后将View添加进去ViewRootImpl里面去。这里有种感觉,removeView做的就可能和上面的相反,从数组移除,然后调用root.removeView()的类似函数去移除。这是猜测,我们先留着,看完我们的主线

我们来看下这个setView里面做了什么

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
    synchronized (this) {
        if (mView == null) {
            mView = 
使用 Python 和可视化编程控制树莓派机械臂myCobot 这些模块包括逻辑、循环、数学、文本、列表、颜色、变量、函数以及控制机械臂的函数等等,所以用户可以轻松入门编程,只需单击右上角的运行就可以启动程序,做一些有趣的应用。可以搭配任意摄像头进行图像识别,具有4个 USB 端口,可以通过 Raspberry Pi 的微型 HDMI 端口连接到显示器. 最后,40 个GPIO 接头可以进行更多扩展应用,机械臂每个接口都有清晰的标记,面板上还有一个电源开关和一个直流电源插孔。您现在可以将机器人放在地板或桌子上,并用力拧紧吸盘,以确保机械臂的底座在操作过程中不会移动。 阅读详情

相关推荐

聊一聊PhoneWindowManager的窗口布局管理

    记得之前在小米的时候,有个同学说PhoneWindowManager是最乱的地方,好像很多杂活都是PhoneWindowManager去干,其实我不太认同这个说法。 仔细分析一下,PhoneWindowManager实现了WindowManagerPolicy, WindowManagerPolicy注释写的很清楚: * This interface supplies all UI-specific behavior of the window manage

woai110120130的专栏 2746

Activity、PhoneWindowWindowManagerImpl、ContextImpl的组织关系

Activity、PhoneWindowWindowManagerImpl、ContextImpl的组织关系

weixin_41126214的博客 296

rk3576 适配摄像头 (mipi 双摄)

RK3576 自带两个 4-Lane DPHY 和一个 DCPHY CSI 接口,可以连接 4lane 的双摄像头,最直接的方式就是充分利用其两个 D-PHY 接口。次选方案是 DCPHY + DPHY方案,更次之方案是单DPHY,设置成分离模式,连接两颗摄像头。

weixin_35723192的博客 318

第8章-理解WindowWindowManager

WindowWindowManager

WzhVae的博客 1176

WindowWindowManager(一)

Window:Window只是一个抽象概念,每一个Window都对应着一个View和一个ViewRootImpl,Window和View是通过ViewRootImpl建立联系,Window是以View的形式存在的。Window是分层,每一个Window都有对应的z-ordered,层级高的会覆盖在层级小的上面。Android中所有的视图都是通过Window来呈现,Window是View的直接管理者。Session对象最后调用的是WMS的addWindow完成window的添加。

weixin_43761183的博客 537

添加的类在classwizard中不显示的解决方法:

添加的类在classwizard中不显示的解决方法: (1).找到工程所在目录. 例如: 工程名为Prop,存放在: E:\VC练习\Prop (2).在: E:\VC练习\Prop目录下找到Prop.clw文件,将其删除.该文件中存放有是classwizard的一些信息. (3).重新打开Prop工程. (4).选择view/classwizard后,弹出Prop.clw文件不存在,问是

wxqian25的专栏 1157

MFC classwizard用法

前面我们利用AppWizard创建了一个应用程序框架,它除了显示一个Windows的多文档界面以外,目前还没有任何实际的用处,我们必须为它添加实际的功能。事实上,大多数Visual C++程序员都是在这个应用程序框架的基础上从事添加各种功能模块的工作,包括设计自己的类,编写具有一定功能的成员函数。Visual C++的集成开发环境向用户提供了一个功能很强的操作类的工具—ClassWizard,我们可以利用该工具非常方便地向应用程序中添加类、向类中添加消息处理函数、成员函数、以及添加成员变量等。利用Class

ayw_hehe的专栏 7656

为什么明明有这个类,但在classwizard里找不到?

classwizard 为我们添加消息等方面,提供了很多的方便。     但是有时候,我们会遇到在类试图里明明有这个类,但在添加对此类对消息响应函数时,在classwizard里却找不到此类的类名。这个问题呢,其实是VC6.0 本身具有的BUG之一。 我们现在需要知道如何解决这一问题。      首先了解 工程文件下的 CLW 文件的作用:这个文件包括ClassWizard中用来编辑的现有类或

3560

VC6.0 有的类在classWizard中无法显示的问题

经常复制、粘贴别人写好的类,有时候会出现类在classWizard中无法显示的问题,添加新的同名类又提示已经存在该文件 只需两步就可以解决: 一、关闭工程,把文件夹中的clw后缀文件删除。 二、再次打开工程,点击View(查看)-> ClassWizard(建立类向导),会提示需要重建该clw文件,选择工程App文件,选择ALL,点击Ok便可。

oceanark的博客 2025

MFC创建类的时候在ClassWizard中找不到新建的类的解决办法

MFC创建类的时候在ClassWizard中找不到新建的类的解决办法: 第一步:在工程目录下找到后缀名为 .clw 的文件,并将它删除。 第二步:回到 VC 中在 View 选项卡下单击 ClassWizard ,系统会提示“The ClassWizard does not exit ! " ,新建一个即可,名字保持和删除之前的文件名相同。 第三步:完成。

chaoyuan899的专栏 3615

如何重新建立ClassWizard

        去年开始改用VS2008写程序了,但有些同事还在用VC6所有有时候难免会有需要把VS2008程序搬回VC6中进行编译的情况.        VC6新建个工程,将所有的.CPP/.H文件全部拷入后编译,基本就能使用.但发现个小问题,就是ClassWizard无法正常运行.之前的所有映射都无法在ClassWizard中找到,当然代码中是有的,如果手工改动的话自然是可以的.不过对于习

Jogholy的专栏 1100

VS2008中ClassWizard的使用

之前VC6.0能很方便地寻找到ClassWizard(建立类向导),但是在VS2008中不容易找到,找了半天类向导,结果发现原来在属性窗口里。 点击类视图,右击相应的类,选择属性就可以看到属性页了,在属性页的上面就有那个闪电箭头了!

coyote的专栏 2069

ClassWizard的一点东西

这里有一个经验要和大家分享.我今天在VC做东西时,用classwizard对一个对话框建立相应的类时,提示:Unable to open......of class "...".或者提示........remnent of class.至于现在是什么原因造成的现在还不是很清楚.刚开怀疑是用的盗版软件的原因.但后来安装了好几个版本都是同样的问题.(虽然安装了好多版本,但都是盗版的).最后,还是没

Lawrencewt的专栏 683

VC classwizard的一点技巧

         当你把一个工程中某些文件移动到另一个工程时,比如我有一个文件叫CWnd0xE0.h和CWnd0xE0.cpp,我把它们移动到了另一个工程里,classwizard不能自动添加CWnd0xE0(base CWnd)的message handle。       可以这么做:       1。打开新工程的.clw文件;       2。找到[General Info]下的Clas

wak1984的专栏 809

C++笔记五——ClassWizard工具的运用

VC编译程序时出现: Cannot open precompiled header file: 'Debug/EX08.pch': No such file or directory 执行 cl.exe 时出错. 1、可以使用右键点击项目工程中的该cpp文件,选择setting,在c/c++栏,选择PreCompiled headers,然后设置第一选项,选择不使用预编译头,解决这个问题。 ...

每天进步一点点 3073

Visual C++ 6.0工程中的项目文件都表示什么

Visual C++ 6.0工程中的项目文件都表示什么。 .opt:工程关于开发化境的参数文件。如工具条位置等信息。 .aps(AppStudio File)资源辅助文件,二进制格式,一般不用去管他。 .clw:ClassWizard信息文件,实际上是INI文件格式,又兴趣可以研究一下。有时候ClassWizard出了问题,手工修改CLW文件可以解决。 如果此文件不存在的话

leafy的博客 2437

contain remnants of that class,VC++中怎样彻底删除一个由ClassWizard生成的类

今天遇到一个问题,给对话框添加新类时,发现这样一个报错:contain remnants of that class. 原因在于这个对话框我之前添加个类,但基类弄错,就删掉源文件,重新添加,接着就出现这样的问题,开始我还以为是clw文件还保留有类的纪录,所以我就删掉这个文件重新编译,发现还是这个问题,查询了一下资料,发现原因是我之前的类浏览文件还在vc窗口打开,一查,果然是这样,关闭这个浏览文件,

houziwo的专栏 1507

VC++的工程文件说明

VC++的工程文件说明: *.dsp:是VC++的项目文件,文本格式。 *.dsw:是工作区文件,它可以指向一个或多个.dsp文件。 *.clw:是 ClassWizard信息文件,实际上是INI文件的格式。 *.opt:工程关于开发环境的参数文件,如工具条位置等信息。 *.aps:(AppStudio File),资源辅助文件,二进制格式。 *.rc:资源文件。 *.plg:是编译信息文件,编译时的error和warning信息文件,在Tools->Options里面有个选项可以控制这

xie__jin__cheng的博客 590

在VC的MFC的对话框中建立ClassWizard时,提示Parsing error: Expected "=".Input Line:……

<br />今天早上编辑程序时,出现了一个小小的问题,觉得自己还没有发过文章,所以在这就写了一小点,在网上也有相关的。当我在VC 的MFC的对话框中建立ClassWizard时,提示Parsing error: Expected "=".Input Line:"m_brush.CreateSolidBrush(RGB(0,0,255));"的对话框,<br />如图:<br />当按确定时在MFC ClassWizard的对话框出现如图:,<br />按OK关掉,当再次双击按钮时出现如图:<br />的错误

Running 2189

在ClassWizard无法显示添加的类解决方法(转载)

自上一年在做课程设计时,我就老遇到一个问题:在为Dialog建立一个类时,总是会出现 Unable to open "...(类的Head文件)"和"...(类的Implementation文件)" for the class (类名).为了这个问题,我在网上下载节多少个不同的VC++6.0,重装了多少次VC++6.0,这简直是在对我硬盘的进行自残. 最后我相信,这是VC++6.0的一个BUG....

weixin_33697898的博客 249

FR configurator sw3 变频设置软件.part05.rar

FR configurator sw3 变频设置软件.part05rar,FR configurator sw3 变频设置软件.part05

上一篇: 源码探索系列12---关于事件分发机制
下一篇: 源码探索系列15---那个AsyncTask里面的FutureTask
Sanjay_f
博客等级 码龄15年 115粉丝 153原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值