前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >笔记——Window与WindowManager(十七)

笔记——Window与WindowManager(十七)

作者头像
木溪bo
发布2019-02-25 17:19:10
7730
发布2019-02-25 17:19:10
举报

——个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主与书籍精华

1、Window、WindowManager:

>1.Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,它们的视图都对应着附加在一个Window上的,因此Window实际是View的直接管理者。Window是一个抽象的概念,一个视图就对应一个Window,每一个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立联系,因此Window并不是实际存在的,它是以View的形式存在。

>2.View是Android中视图的呈现方式,但是View不能单独存在,它必须附着在Window这个抽象的概念上面,因此有视图的地方就有Window,Activity、Dialog、Toast等视图都对应着一个Window(不同的),有几个视图就有几个Window。

>3.View的三大流程均是通过ViewRoot来完成的,ViewRootImpl是ViewRoot的具体实现类,具体的View管理任务由PhoneWindow(PhoneWindow是Window的实体类)关联ViewRootImpl来完成。在ActivityThread中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时PhoneWindow会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。View的绘制流程是从ViewRoot的performTraversals方法开始的,它经过measure、layout和draw三个过程才能最终将一个View绘制出来。

>4.Activity->Window(PhoneWindow实体类)->ViewRoot(ViewRootImpl实现DecorView与Window之间的联系)->DecorView->ViewGroup->View,在PhoneWindow中通过 generateDecor(-1)方法创建了一个DecorView然后通过generateLayout(mDecor)方法来加载具体的布局文件到DecorView中。DecorView可不包含状态栏、导航栏这些。

>5.Toast是基于Window来实现的,但是由于Toast具有定时取消这一功能,所以系统采用了Handler。显示和隐藏Toast都需要通过NMS来实现,由于NMS运行在系统的进程中,所以只能通过远程调用的方式来显示和隐藏Toast。Toast的显示过程是调用了NMS中的enqueueToast方法实现的,将新创建的Toast添加入ToastQueue队列中,对于非系统应用来说,ToastQueue中最多能同时循环创建50个ToastRecord,这样做是为了防止DOS(Denial of Service),也是为了避免占用屏幕让其他应用也能使用Toast。

2、获取屏幕可视区域参数:使用当前窗口中依附的任意View执行getWindowVisibleDisplayFrame()返回的结果都是一样的,“当前窗口中的任意View”也就是已经添加至UI中可见的控件。Activity/Fragment/Dialog的onWindowFocusChanged()方法中使用该方法才是准确的,因为该方法的调用时机是Window加载完成,所有View也都添加进来了。

Android获取窗口可视区域大小

Android中获得屏幕宽高的实用方法

android整个DecorView上移到软键盘的上面

Rect outRect= new Rect();

view.getWindowVisibleDisplayFrame(outRect);/getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);

虽然方法名字中有一个Visible,但是getWindowVisibleDisplayFrame()的结果并不受该窗口是否在被其他窗口遮挡的影响。即使该窗口已经被切换到后台,只要该窗口还没有detach,getWindowVisibleDisplayFrame()的结果就不会变化。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.01.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档