zoukankan      html  css  js  c++  java
  • 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等)

  • 相关阅读:
    [JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏
    [JZOJ3337] 【NOI2013模拟】wyl8899的TLE
    UVA 1262 Password
    UVA 10820 Send a Table
    UVA 12716 GCD XOR
    UVA 10791
    UVA 10375 choose and divide (唯一分解定理)
    欧拉函数
    51 Nod 1069 Nim游戏
    51 Nod 1242 矩阵快速幂求斐波那契数列
  • 原文地址:https://www.cnblogs.com/hustcser/p/10295323.html
Copyright © 2011-2022 走看看