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等)

最新文章

  1. spring ioc 源码解析
  2. cps变换
  3. SVN和CVS的区别
  4. 5.防止FPGA设计中综合后的信号被优化
  5. Android无法访问本地服务器(localhost)的解决方案
  6. 关于Python中的self
  7. MyEclipse导入ant项目——Java编程思想
  8. android studio简易了解第二部分
  9. 怎么都没人提 google 加密搜索呢? google如何稳定打开
  10. 一行一行分析JQ源码学习笔记-01
  11. Javascript正则表达式完全学习手册
  12. c++builder中 扩展c++的关键字 : _published _automated Get/Set指令 _fastcall
  13. VS 2008 开发WinCE程序 编译部署速度慢的解决办法
  14. 项目管理器 ProjectManager Beta 10 发布
  15. 【Android 应用开发】Android开发 使用 adb logcat 显示 Android 日志
  16. 一个非常简单的IMPDP事儿
  17. java笔试要点(java.sql包)
  18. UML 类图口诀
  19. solr 5.0.0 bin/start脚本详细解析
  20. DNS协议工作过程;DNS的安全隐患

热门文章

  1. ubuntu下使用OBS开斗鱼直播
  2. nodejs后台启动
  3. Z划分空间
  4. [ios]objective-c 协议和委托 (重点基础知识)
  5. Android OkHttp经验小结
  6. 评分条RatingBar Android
  7. 【spring】spring的事务传播性 hibernate/jpa等的事务隔离性
  8. ylb:了解存储过程
  9. 传输层:UDP 协议
  10. ASP.NET Web API是如何根据请求选择Action的?[下篇] 【转】