美文网首页
笔记——Window与WindowManager(十七)

笔记——Window与WindowManager(十七)

作者: 木溪bo | 来源:发表于2019-01-04 17:57 被阅读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()的结果就不会变化。

    相关文章

      网友评论

          本文标题:笔记——Window与WindowManager(十七)

          本文链接:https://www.haomeiwen.com/subject/wwkkrqtx.html