• Android-理解window和windowmanager


    1.window和windowmanager的关系

    window是一个抽象类,具体实现为phoneWindow。创建一个window可以通过windowmanager来实现。

    window的具体实现在windowManagerService中。

    windowManager和windowManagerService的交互是一个IPC过程。

    2.windowManager.LayoutParams中flags与type

    flags表示window的属性:

    FLAG_NOT_FOCUSABLE 表示不需要获得焦点,最终事件会传递给下层具有焦点的window

    FLAG_NOT_TOUCH_MODEL 当前window区域的自己处理,区域之外的传递给底层的window

    FLAG_SHOW_WHEN_LOCKED 可以让window显示在锁屏的界面上

    type有三种:

    应用window — activity 层级1-99

    子window — dialog等 层级 1000-1999

    系统window — toast,系统状态通知栏 层级2000-2999 需要权限,可以用TYPE_SYSTEM_OVERLAY或者TYPE_SYSTEM_ERROR

    用法:

    mLayoutParams.flags = LayoutParams.xxxx

    mLayoutParams.type = LayoutParams.xxxx

    mWindowManager.addview(xx,mLayoutParams)

    3.windowManager提供的功能

    addView 添加view

    updateViewLayout 更新view

    removeView 删除view

    4.addView工作机制

    windowManager也是一个接口,真正实现在windowManagerIpml,然后用windowManagerGlabal处理。

    windowManagerGlabal的实现过程:

    1)检查参数是否合法,若是子window那个要调整一些布局参数

    2)创建viewRootImpl并将view添加到列表

    3)通过viewRootImpl来更新界面并完成window的添加过程

    5.removeView工作机制

    跟addView一样,用windowManagerGlabal实现,通过viewRootImpl完成删除。

    在windowManager中有同步和异步删除两种方法,一般不用同步,异步removeView是通过viewRootImpl的die方法发送一个请求删除的信息,最终删除在viewRootImpl的Handler中的dodie方法,实际用dispatchDetachedFromWindow完成删除

    6.updateViewLayout 工作机制

    用windowManagerGlabal,通过viewRootImpl的serLayoutParams更新layout,最终通过windowManagerService的relayoutWindow完成实现

    7.activity的window创建过程

    1)如果没有DecorView,那么创建它

    2)将view添加到DecorView的mContentParent中

    3)回调activity的onContentChanged方法通知activity视图已经发生改变

    8.Dialog的window创建过程

    1)创建window

    2)初始化DecorView并将dialog的视图添加到DecorView中

    3)将DecorView添加到window中并显示

    注:普通的dialog要使用activity的context,application的context会报错,解决方法是可以将其指定为系统window并添加权限

    9.toast的window创建过程

    通过toast中TN的show和hide来完成显示和隐藏,这两个方法被NMS以跨进城的方式调用,内部分别是handleShow和handleHide

    10.一个应用中到底有多少个window呢?

    答案:应用window的个数(activity)+子window的个数(dialog等)+系统window的个数(toast等)

  • 相关阅读:
    .netCore+Vue 搭建的简捷开发框架 (5)
    .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础 -2
    Vue 学习笔记
    .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础
    .netCore+Vue 搭建的简捷开发框架 (3)-- Services层实现
    .netCore+Vue 搭建的简捷开发框架 (2)--仓储层实现和EFCore 的使用
    .netCore+Vue 搭建的简捷开发框架
    在线.net C#和vb.net 语言互转
    VB.net 通过句柄操作其他窗口
    vb.net 多线程爬虫抓取免费代理IP
  • 原文地址:https://www.cnblogs.com/hustcser/p/10295323.html
Copyright © 2020-2023  润新知