IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android开发艺术探索八 理解Window 和 WindowManager -> 正文阅读

[移动开发]Android开发艺术探索八 理解Window 和 WindowManager

Window: View 的直接管理者。

WindowManager :是一个接口,实现类是WindowManagerImpl

????????????????????????????????WindowManager和 WindowManangerService 的交互是IPC过程

Window:

????????flags:控制window的显示特性

????????????????FLAG_NOT_FOCUSABLE: 表示window不需要获取焦点,也不需要接收各种输入

????????????????????????事件。此标记会同时启用FLAG_NOT_TOUCH_MODAL。最终事件会传递给

????????????????????????下层的?具有焦点的window

????????????????FLAG_NOT_TOUCH_MODAL:系统会将当前window区域以外的单击事件传递给

????????????????????????底层的window.当前区域以内的单击事件自己处理。一般会开启

????????????????FLAG_SHOW_WHEN_LOCLED:可以让window显示在锁屏界面上

????????type:表示window的类型(层级大的Window会覆盖在层级小的Window上面)

? ? ? ? ? ? ? ? 应用Window: Activity

? ? ? ? ? ? ? ? 子Window:Dialog

? ? ? ? ? ? ? ? 系统Window:Toast, 系统状态栏

? ? ? ? ? ? ? ? 系统层级常用:TYPE_SYSTEM_OVERLAY,TYPE_SYSTEM_ERROR

? ? ? ? ? ? ? ? ? ? ? ? 例如:步骤一:mLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR

????????????????????????步骤二:声明系统权限(android.permission.SYSTEM_ALERT_WINDOW)

Window内部机制:

WindowManagerImpl 委托 WindowManagerGlobal 实现 添加,删除,更新。每次操作都是一次IPC过程。

? ? ? ? 添加:1.检查参数是否合法

????????????????2.创建ViewRootImpl,并将View添加到列表中

????????????????3.ViewRootImpl更新界面并完成Window的添加过程(mWindowSession是Binder

????????????????????????对象,Window添加过程是一次IPC调用,Session 通过 WindowManagerService

????????????????????????添加Window,每个应用保留一个单独的Session)

????????删除:数组遍历,查找删除的View索引

????????????????removeViewImmediate:同步删除

???????????????? removeView:异步删除(常用)

? ? ? ?(异步删除 发送MSG_DIE消息,ViewRootImpl 中的Handler会处理此消息,调用doDie()

? ? ? ? 同步删除 不发消息,直接调用doDie())

? ? ? ? ? ? ? ? dispatchDetachedFromWindow():

????????????????????????1.垃圾回收相关工作,比如清楚数据和消息,移除回调

????????????????????????2.通过Session的 remove 方法删除Window:这同样是一个IPC过程,最终会

????????????????????????????????调用WindowManagerService的 removeWindow方法

? ? ? ? ? ? ? ? ? ? ? ? 3.调用View 的dispathDetachedFromWindow方法,内部会调用View的 ????????????????????????????????onDeatachedFromWindow()以及

????????????????????????????????onDetachedFromWindowInternal()。onDetachedFromWindwo()当View

????????????????????????????????从Window 中移除时会调用。可以做一些资源回收的工作,例如停止动画,

????????????????????????????????停止线程等。

? ? ? ? ? ? ? ? ? ? ? ? 4.调用WindowManagerGlobal的 doRemoveView刷新数据,

????????????????????????????????包括mRoots,mParams,mDyingView都需要将当前Window关联的这三类

????????????????????????????????对象从列表中删除。

????????更新:移除老的LayoutParams参数,添加新的LayoutParams参数。

????????????????通过ViewRootImpl实现,并通过WindowSession更新Window视图。

????????????????调用WindowManagerService的relayWindow(),也是一个IPC过程。

Window的创建过程:

Window 对象的创建是通过PolicyManager的 makeNewWindow方法实现的?

? ? ? ? Activity:· ·1.如果没有DecorView,那么就创建它

????????????????????????2.将View 添加到DecorView的mContentParent中

? ? ? ? ? ? ? ? ? ? ? ? 3.回调Activity 的 onContentChanged 方法,通知Activity视图已经发生改变

????????Dialog:····1.创建Window

????????????????????????2.初始化DecorView , 并将Dialog的视图添加到DecorView中

? ? ? ? ? ? ? ? ? ? ? ? 3.将DecorView添加到Window中显示

? ? ? ? ? ? ? ? (普通dialog 有一个特殊之处:那就是必须采用Activity的 Context ,如果采用

????????????????Application的会报错“没有应用token” , 而“应用token” 一般只有Activity 拥有。

????????????????系统Window比较特殊,不需要token)

????????Toast: 1.由于 Toast 具有 定时取消 功能,所以系统采用了Handler.

? ? ? ? ? ? ? ? 2.Toast内部有两类IPC过程。第一类:Toast 访问 NotificationManagerService ;

????????????????第二类 :NotificationManagerService 回调Toast的 TN 接口

? ? ? ? ? ? ? ? 3.内部视图指定方式:系统默认 , setView

? ? ? ? ? ? ? ? 4.显示和隐藏 Toast 都需要通过NMS ,由于 NMS运行在系统进程,所以只能通过远程调用。TN 是一个Binder类,在Binder线程池中,所以需要Handler 切换到使用Toast的线程,因此无法在没有Looper的线程中弹出。将Toast 请求封装为ToastRecode存放在 mToastQueue (ArrayList ),非系统应用最多50个Toast.

????????

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:24:56  更:2021-11-28 11:27:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:50:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码