返回顶部
首页 > 资讯 > 移动开发 >Android窗口机制
  • 442
分享到

Android窗口机制

Android 2022-06-06 13:06:18 442人浏览 泡泡鱼
摘要

DecorView通过PhoneWindow与WindowManagerService通信原理图 每个Activity都有一个Window对象

DecorView通过PhoneWindow与WindowManagerService通信原理图

在这里插入图片描述

每个Activity都有一个Window对象,这个对象是PhoneWindow类型的。
每个Window对象里面都维护着一个WindowManager对象。

Activity里面添加一个View是通过WindowManager的addView()方法实现的

相关关键类

WindowManagerService
高层级,系统窗口管理服务

Window
一个顶级窗口的外观和行为策略的一个抽象基类。

Window并不是真实存在的,它表示一种抽象的功能集合,View才是Android中的视图呈现形式,绘制到屏幕上的是View不是Window,但是View不能单独存在,它必需依附在Window这个抽象的概念上面,Android中需要依赖Window提供视图的有Activity,Dialog,Toast,PopupWindow,StatusBarWindow(系统状态栏),输入法窗口等,因此Activity,Dialog等都维护着一个Window对象。当我们调用Activity的setContentView()时,其实最终会调用Window的setContentView(),当我们调用Activity的findViewById()时,其实最终调用的是Window的findViewById()。
对 Window 的操作是通过 WindowManager 来完成的。

WindowManager
WindowManager是一个接口,里面常用的方法有:添加View,更新View和删除View,WindowManager继承自ViewManager,这三个方法定义在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
低层次,负责与系统窗口管理服务进行操作通信,与Context进行关联。
是WindowManager的实现类,大部分工作都通过WindowManagerGlobal来实现。
WindowManagerGlobal
低层次,负责与系统窗口管理服务进行操作通信,不与Context进行关联。

ViewRootImpl
ViewRootImpl是一个视图层次结构的顶部,它实现了View与WindowManager之间所需要的协议,作为WindowManagerGlobal中大部分的内部实现,也就说WindowManagerGlobal方法最后还是大部分调用了ViewRootImpl。
类似 ApplicationThread 负责跟AMS通信一样,ViewRootImpl 的一个重要职责就是跟 WMS 通信,它通过静态变量 swindowsession(IWindowSession实例,在WindowManagerGlobal中创建)与 WMS 进行通信。

源码分析

ActivityThread.handleResumeActivity()方法 :

  @Override
    public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) {
    ...//其他代码
          if (a.mVisibleFromClient) {
                if (!a.mWindowAdded) {
                    a.mWindowAdded = true;
                    wm.addView(decor, l);
                } else {
                    // The activity will get a callback for this {@link LayoutParams} change
                    // earlier. However, at that time the decor will not be set (this is set
                    // in this method), so no action will be taken. This call ensures the
                    // callback occurs with the decor set.
                    a.onWindowAttributesChanged(l);
                }
            }
    ...//其他代码
 }

调用WindowManagerImpl.addView() :

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

调用WindowManagerGlobal.addView():

    public void addView(View view, ViewGroup.LayoutParams params,
            Display display, Window parentWindow) {
        ...//其他代码
            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) {
                // BadTokenException or InvalidDisplayException, clean up.
                if (index >= 0) {
                    removeViewLocked(index, true);
                }
                throw e;
            }
        }
    }

调用ViewRootImpl.java的setView方法

    
    public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
        synchronized (this) {
         		...//其他代码
                // Schedule the first layout -before- adding to the window
                // manager, to make sure we do the relayout before receiving
                // any other events from the system.
                requestLayout(); //请求布局
                if ((mWindowAttributes.inputFeatures
                        & WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0) {
                    mInputChannel = new InputChannel();
                }
                mForceDecorViewVisibility = (mWindowAttributes.privateFlags
                        & PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY) != 0;
                try {
                    mOrigWindowType = mWindowAttributes.type;
                    mAttachInfo.mRecomputeGlobalAttributes = true;
                    collectViewAttributes();
                    res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
                            getHostVisibility(), mDisplay.getDisplayId(), mWinFrame,
                            mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
                            mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel);
                } 
			    ...//其他代码
}

res = mWindowSession.addToDisplay() 调用了Session的addToDisplay()方法:

    @Override
    public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
            int viewVisibility, int displayId, Rect outFrame, Rect outContentInsets,
            Rect outStableInsets, Rect outOutsets,
            DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel) {
        return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outFrame,
                outContentInsets, outStableInsets, outOutsets, outDisplayCutout, outInputChannel);
    }

调用mService.addWindow()方法添加Window,这个mService其实就是WindowManagerService对象,也就是说布局最终是由 WindowManagerService 来添加的。
分析到这里可以看到,ViewRootImpl是通过 mWindowSession(来自WindowManagerGlobal的sWindowSession对象)和WindowManagerService通信的。

参考:
ViewManager、ViewRootImp、WindowManagerImpl、WindowSession等详细解析
Android窗口机制(一)——Window,PhoneWindow,DecorView理解
Window窗口机制(二)——Window,WindowManager理解
Window窗口机制(三)——WindowManager,ViewRootImpl,View理解
Android 窗口机制
Android窗口机制(四)ViewRootImpl与View和WindowManager
android WindowManagerService
Window, WindowManager和WindowManagerService之间的关系

android window(三)ViewRootImpl
ViewRootImpl的独白,我不是一个View(布局篇)

ViewRootImpl源码分析事件分发

面试进阶之窗口机制

https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/view/Window.java
Https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/view/WindowManagerImpl.java
https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/view/WindowManagerGlobal.java
https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/core/java/android/view/ViewRootImpl.java
http://androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/services/core/java/com/android/server/wm/Session.java
https://www.androidos.net.cn/android/9.0.0_r8/xref/frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java


作者:yzpyzp


--结束END--

本文标题: Android窗口机制

本文链接: https://lsjlt.com/news/28904.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android窗口机制
    DecorView通过PhoneWindow与WindowManagerService通信原理图 每个Activity都有一个Window对象...
    99+
    2022-06-06
    Android
  • 浅谈AndroidDialog窗口机制
    目录问题引出Dialog源码分析构造方法show()方法问题引出 //创建dialog 方式一 AlertDialog.Builder builder=new AlertDialo...
    99+
    2024-04-02
  • Android手机悬浮窗口小案例
    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 –主页面——– //布局中就一个Button public class MainActi...
    99+
    2022-06-06
    悬浮窗口 Android
  • Android N多窗口支持
    Android N 可以同时显示多个应用窗口。 在手机上,两个应用可以在“分屏”模式中左右并排或上下并排显示。例如,用户可以 在上面窗口聊QQ,下面窗口发送短信。如图所示,两个app在分屏模式中上下显示:如何让你的app支持多窗口?如果你的...
    99+
    2023-05-31
    android 多窗口 roi
  • android 窗口焦点介绍
    背景 我们经常会遇到一种Application does not hava focused window的ANR异常,这种异常一般是没有焦点窗口FocusedWindow导致,且这类异常只会发生在key事件的派发,因为key事件是需要找到一...
    99+
    2023-08-21
    android
  • 结合Windows窗口深入分析Android窗口的实现
    目录前言对于Window的认识阶段寻找真正的WindowWindow到底是什么Activity-Window-View的关系前言 从windows窗口的概念开始,通过对比去理解And...
    99+
    2023-05-16
    Android窗口 Android窗口机制
  • python怎么控制windows窗口
    要控制Windows窗口,您可以使用`pywin32`库来与Windows API进行交互。首先,您需要安装`pywin32`库。可...
    99+
    2023-10-11
    python
  • JavaScript怎么定制新窗口
    这篇文章主要介绍“JavaScript怎么定制新窗口”,在日常操作中,相信很多人在JavaScript怎么定制新窗口问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript怎么定制新窗口”的疑惑有所...
    99+
    2023-06-03
  • Android应用程序窗口(Activity)窗口对象(Window)创建指南
           在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程。由此可知,每一个Activity组件都有一个关联...
    99+
    2022-06-06
    程序 对象 activity Android
  • 制作弹出公告窗口(转)
    有时我们需要采用公告窗口来展示一些重要的信息,所谓公告窗口是指我们浏览主页时,随主页面的加载而自动弹出的小窗口,公告窗口中一般会放上新闻、布告的信息。下面我们看看怎样用几句简单的Javascript语句来实现它。方法一:在之间插入如下一段J...
    99+
    2023-06-03
  • html弹出窗口怎么制作
    要制作 html 弹出窗口,需要使用 元素并设置 id、class 和 style 属性来创建弹出窗口容器。随后使用 javascript 的 window.open() 函数或其他参...
    99+
    2024-05-21
    css
  • PyQT5实现选项卡窗口、堆栈窗口、停靠窗口、子窗口
    一、选项卡控件QTabWidget import sys # 使用调色板等 from PyQt5.QtGui import QIcon # 导入QT,其中包含一些常量,例如颜色...
    99+
    2024-04-02
  • Android弹出窗口实现方法
    本文实例讲述了Android弹出窗口实现方法。分享给大家供大家参考,具体如下: 直接上代码: public static void displayWindow(Contex...
    99+
    2022-06-06
    方法 Android
  • Android实现左滑关闭窗口
    前言 目前市场很多的APP都带有窗口滑动切换关闭,这种切换,使得用户操作比较爽,而且觉得功能点上也比较大气,在此就是自己总结了一个简易的方法,直接替换在基础窗口里面,使用安卓最基础的...
    99+
    2024-04-02
  • Android T WMS窗口相关流程
    文章目录 一、介绍二、流程简述1.客户端2. 通信方式3. 服务端3.1.addWindow3.2 relayoutWindow3.3 finishDrawingWindow 4.窗口状...
    99+
    2023-10-07
    android
  • Android窗口层级(Window Type)分析
    前言 Android的窗口Window分为三种类型: 应用Window,比如Activity、Dialog;子Window,比如PopupWindow;系统Window,比如Toast、系统状态栏、导...
    99+
    2023-10-26
    android 窗口层级
  • 深入浅析Android接口回调机制
    在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的...
    99+
    2022-06-06
    回调 android接口回调 Android
  • android多窗口模式怎么实现
    Android多窗口模式可以通过以下几个步骤实现:1. 在AndroidManifest.xml文件中声明`android:resi...
    99+
    2023-09-18
    android
  • Android画中画窗口如何开启
    这篇文章主要讲解了“Android画中画窗口如何开启”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android画中画窗口如何开启”吧!基础画中画manifest 设置为了适配开启画中画状态...
    99+
    2023-07-04
  • Android画中画窗口开启方法
    目录基础画中画布局开启画中画基础画中画 manifest 设置 为了适配开启画中画状态时窗口的大小尺寸变化合理,我们需要修改 activity 中的对应属性 请为您的主 activi...
    99+
    2023-01-04
    Android画中画模式 Android画中画窗口 Android画中画实现
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作