Window的内部机制
2018-05-01 01:43:09 9 举报
为你推荐
查看更多
Window的内部机制
作者其他创作
大纲/内容
NMS处理时会跨进程回调TN(Binder)中的方法
Session内部通过WMS.addWindow()添加Window
调用removeViewLocked
Global中有mViews、mRoots、mParams、mDyingViews(ArraySet)等列表
Window的更新过程
分别用于将Toast视图添加到Window中和移除
mTraversalRunnable.run() ,内部调用 doTraversal
TN运行在Binder线程池中,需Handler切换到当前线程,即发送Toast请求所在的线程
将Toast请求封装为ToastRecord对象
将record加到mToastQueue队列中
Window的内部机制
调用root.requestLayout()完成异步刷新请求
WindowManagerImpl.removeView()
ActivityThread.performLaunchActivity()
mWindowSession类型是IWindowSession,Binder对象,实现类是Session
nms.enqueueToast()和nms.cancelToast()
Toast内部使用Handler.post(runnable)
是
没有DecorView则创建一个
record.callback.hide()
PolicyManager.makeNewWindow创建Win对象
NotificationManagerService简称NMS
直接调用doDie方法
检查参数是否合法,对子Win调整一些布局参数
通过findViewLocked查找待删除的View的索引
record.callback.show()
更新View的LayoutParams,再更新Root的LP
dialog.show()
否
NMS运行于系统进程,只能通过远程调用来显示隐藏
调用root.setView()更新界面
show和cancel中获取NMS是一个IPC
是否异步
通过session更新window的视图
activity.onResume()
mDecor.setVisibility(),activity的视图可见
创建Window对象,并设置回调
最终由WMS的relayoutWindow实现
发送MSG_DIE的消息,root中Handler处理并调用doDie
调用activity.attach()
mGlobal.removeView()
ActivityThread的handleResumeActivity()
由record的callback完成Toast的显示
必须采用Activity的Context,因其拥有应用token,app的没有
调用dispatchDetachedFromWindow删除View
phoneWindow.setContentView()
显示和隐藏都需要通过NMS实现
Window的创建过程
将act的布局文件添加到DecorView
Activity的Window的创建过程
出现两个IPC过程
实现类Policy中可知Window具体类是PhoneWindow
通过WM将DecorView添加到Window中并显示
实际对象为PhoneWindow
WindowManagerGlobal.addView()
activity.makeVisible()
WindowManagerImpl.updateViewLayout()
nms通过cancelToastLocked隐藏Toast
Window的添加过程
WindowManagerImpl.addView()
NMS通过showNextToastLocked显示当前Toast
创建ViewRootImpl并将View添加到列表
1、垃圾回收相关工作,如清除数据和消息、移除回调2、通过Session的remove方法删除Window3、调用View的dispatchDetachedFromWindow方法,内部调用donDetachedFromWindow4、调用global的doRemoveView方法刷新数据,从三大列表中移除相应对象
执行performTraversals()开始绘制View
在root中通过scheduleTraversals对view重新布局
Window
activity.setContentView()
回调Activity的onContentChanged通知Act视图已经发生改变
callback是TN对象的远程Binder,跨进程调用TN的方法
root.die
Dialog的Window创建过程
初始化DecorView,将View添加到decor中
调用scheduleTraversals()
调用mWindowSession.addToDisplay
Window的删除过程
nms通过scheduleTimeoutLocked发送延时消息
使用类加载器创建Activity的实例对象
调用了handleShow和handleHide
同样由PolicyManager的makeNewWindow完成
Toast的Window创建过程
0 条评论
回复 删除
下一页