android 之 window与windowManager讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk_beicai/article/details/78999122
1.window表示一个窗口,需要在桌面上显示一个悬浮窗的东西,需要用到window来实现。
它是一个抽象类,具体实现是phoneWindow,windowManager是外界访问window的入口。
window的具体实现在windowManagerService中,
window是view的直接管理者。
2.通过windowManager添加一个window
windowManger中的flags和type两个参数:
flags: 表示window的属性,通过一些选项控制window的显示特性,
1)FLAG_NOT_FOCUSABLE:
表示window不需要获取焦点,直接传递下层的具有焦点的window
2) FLAG_NOT_TOUCH_MODAL:
系统将当前window区域以外的点击事件传递给底层的window,当前的window区域以内的点击事件
自己处理
3)FLAG_SHOW_WHEN_LOCKED
window显示在锁屏的界面

type: 表示window的类型:类型有三种分别是应用window,子window,系统window
应用类window对应着一个activity
子window不能单独存在,需要依附在特定的父window之中,(dialog)
系统window: 需要声明权限才能创建的window,(toast 和系统状态栏)

window的内部机制:
window是一个抽象概念,每一个window都对应一个view和viewRootImpl
window和view是通过viewRootImpl简建立连接,
view是window的实体,提供了三个接口,addView updateViewLayout removeView
对window的访问必须通过windowManager

通过上边的三个接口分析window的内部机制:
1)window的添加过程:
window的添加需要通过windowManager的addview实现,
真正实现是windowManagerImpl类;在这个类里面实现了addview(),removeView;
updateViewLayout()三个操作;
在windowManagerImpl并没有直接实现三个操作,而是通过windowManagerGlobal来处理

windowMangerGlobal的addview的主要实现:
1)首先检查参数是否合法,如果是子window就需要调整一些布局参数。
通过windowManager.layoutParams来进行调整
2)通过viewRootimpl将view添加列表中。
3)通过viewRootImpl来更新界面完成window的添加过程;

window的删除过程
和添加过程一样。首先通过windowMangerImpl后在通过windowManagerGlobal的removeview来实现删除,
他主要是通过findViewLocked来查找删除view的索引(通过数组遍历)
然后调用removeViewLocked进行删除;

window的更新过程
windowManagerGlobal的updateViewLayout方法:
更新view的layoutParams替换掉老的layoutparams,接着更新viewRootImpl的layoutParams,
通过setLayoutParams实现,在viewRootImpl中通过schedleTravesals方法对view重新进行测量绘制布局等操作,

activity的window创建过程
通过policyManager的makeNewWindow来完成,创建后的对象是phoneWindow;
window的具体实现是phoneWindow,phoneWindow的setContentView的方法开始分析:
1)如果没有decorView,那么就创建它。
通过installDecor方法内部的generateDecor来创建decorView,但还只是一个空白FragementLayout

将view添加到DecorView的mContentParent中;
回调Activity的onContentChanged方法通知activity视图已经改变;
但是这个时候DecorView并没有被windowManager识别,应该调用activity的onResume方法,接着
调用makeVisible(),decorView真正的完成添加显示,到这里activity才被用户看见;

doalog的window创建;
·1)创建window ,
通过policyManager的makeNewWindow方法创建phoneWindow;
2)初始化decorView并将dialog的视图添加到decorView中

3)将decorView添加到window中并显示

toast的window创建
toast是系统window,内部视图由两种方式指定,一种是默认样式,另一种是setView的自定义view。
Toast提供show()和cancel()方法实现隐藏显示;
显示和隐藏toast通过NMS来实现,通过enqueueToast方法将toast请求封装成ToastRecord对象,
(方法的参数:
1)第一个参数是应用报名
2)第二个参数表示远程回调
3)Toast的时长
)
并添加到队列当中,当ToastRecord被添加到队列中后,NMS就会显示当前的toast

猜你喜欢

转载自blog.csdn.net/wk_beicai/article/details/78999122