关闭

Android GUI系统-ViewTree的管理者(三)

标签: viewroot跟WMS的通信ViewRoot的工作方式
41人阅读 评论(0) 收藏 举报
分类:

作为ViewTree的管理者ViewRoot,是怎么工作的。


一,ViewRootImpl跟WMS间的通信

ViewRootImpl.java在构造的时候,需要建立跟WMS的通信的双向通道:

ViewRootImpl –>WMS:IwindowSession

WMS →ViewRootImpl :Iwindow

IwindowSessionIWindow是匿名的BinderServer 需要借助一定的方式才能提供服务。

1)在ViewRootImpl的构造函数中,利用WMS提供的openSession接口获取IWindowSession的服务句柄,存储在内部变量mWindowSession中。

public ViewRootImpl(Context context, Display display) @ViewRootImpl.java{
	mWindowSession = WindowManagerGlobal.getWindowSession();
}

public static IWindowSession getWindowSession() @WindowManagerGlobal.java{
	if (sWindowSession == null) {
		InputMethodManager imm = InputMethodManager.getInstance();
		IWindowManager windowManager = getWindowManagerService();
		sWindowSession = windowManager.openSession(
			new IWindowSessionCallback.Stub() {
				public void onAnimatorScaleChanged(float scale) {
					ValueAnimator.setDurationScale(scale);
				}
			},
			imm.getClient(), imm.getInputContext());
	}
	return sWindowSession;
}

这里的windowManagerWindowManagerService在本地进程端的代理,windowManager的请求都是在远程端有WMS实现;

ActivityThread中,处理handleResumeActivity时,也有一个WindowManager,即:ViewManagerwm =a.getWindowManager();这里的wmViewManager,它是WindowManager类的基类,最终实现是WindowManagerImpl,是完全属于本地端的,存储与应用进程内部用于窗口管理的相关事务。


2)在handleResumeActivity中,通过wm.addView(decor,l),最后会调用ViewRootImplViewRootImplsetView,这个函数一方面把DecorView,也即是?viewtree的根设置到ViewRootImpl中,用mView保存;另一方面会向WMS申请注册一个窗口,同时把mWindow对象(W类型,IWindow的子类)传给WMS

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) 	@ViewRootImpl.java{
	res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
		getHostVisibility(), mDisplay.getDisplayId(),
		mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
		mAttachInfo.mOutsets, mInputChannel);
}

跟窗口相关的两个概念,phoneWindow继承自Window类,是应用进程端对窗口的描述,表达了对窗口的一种约束;WMS中的window是一个抽象的概念,用WindowState来描述其状态,WindowState可以认为是WMS中对窗口的描述。


二,ViewRootImpl的工作方式

每个ViewTree只对应一个ViewRoot,它将跟WMS进行一系列的通信,包括窗口的注册、大小调整等。什么情况会执行这些操作?

1ViewTree内部的请求,如view对象要更新UI,它会通过invalidate或者其他方式发起请求,随后这些请求会沿着ViewTree层层网上传递,最终到达ViewRoot,做为ViewTree的管理者它根据一系列实际情况来执行相应操作(如发起一个遍历、通知WMS等)。

2)外部的状态更新,如WMS回调viewroot通知界面大小改变、触摸事件、按键事件等。

不管是内部请求、还是外部请求,viewroot通常会把这些消息入栈,然后ViewRootImplViewRootHandler类来统一处理他们。ViewRootImpl是在WindowManagerImpladdView的过程中创建的,addView调用的起点是ActivityThreadhandleResumeActivity,所以说ViewRootImpl实际是运行在主线程中,ViewRootHandler实际上会跟主线程的消息队列挂钩。


内外部的请求都先入队到主线程的messagequeue,再有Viewroot具体处理。



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

用Java GUI做一个简单的管理系统

教师学生信息管理系统、java初学者,利用Java语言的GUI完成
  • qq_36330228
  • qq_36330228
  • 2017-04-17 16:07
  • 5954

java GUI 学生图书管理简单示例

简单GUI图书管理系统
  • qq_28929579
  • qq_28929579
  • 2016-12-10 23:11
  • 1429

Java GUI 实战练习 学生成绩管理系统

学习java有一年多了,一直在做web方面的练习,在一个项目中发现需要用到GUI的相关知识,结果没法做出来,网上这方面的文章又不是很多,所有只好自己硬着头皮从头再学一遍了,不过学习后发现,其实GUI是...
  • u012131769
  • u012131769
  • 2014-03-23 18:11
  • 4598

Android GUI系统-ViewTree的绘图遍历(六)

ViewTree的绘图遍历 绘图遍历也就是ViewTree遍历过程的最后一步。这个过程有3个核心的步骤: 1)canvas= mSurface.lockCanvas(dirty); 2)mVie...
  • lin20044140410
  • lin20044140410
  • 2018-01-07 20:48
  • 23

Android GUI系统-ViewTree的创建(二)

View树的创建过程 当AMS通知应用进程来启动一个Activity任务时,最终这个请求会转化为ActivityThread中的一个消息LAUNCH_ACTIVITY,同类型的消息还是RESUME_...
  • lin20044140410
  • lin20044140410
  • 2017-12-21 22:38
  • 43

Android GUI系统-ViewTree的遍历(四)

那些情况会引起ViewTree的遍历 1)应用程序刚启动时,会在构造出整棵ViewTree后,执行第一次遍历。 public void setView(View view, WindowMan...
  • lin20044140410
  • lin20044140410
  • 2017-12-26 07:09
  • 29

Android图形用户界面开发之ViewTree和DecorView详细介绍

Android图形用户界面开发之ViewTree和DecorView详细介绍 出处:西西整理 作者:西西 日期:2013/1/4 0:23:10 [大 中 小] 评论: 0 | 我要发表看法...
  • murongbingxiao
  • murongbingxiao
  • 2015-07-10 10:09
  • 303

Android图形用户界面开发之ViewTree和DecorView详细介绍

图形用户界面(GUI)是Android应用程序开发不可或缺的一部分。其不仅能为用户提供输入,还能够根据(用户)执行的动作,提供相应的反馈。因此,作为开发人员,能够理解UI(用户界面)是如何创建以及跟新...
  • wxlinwzl
  • wxlinwzl
  • 2014-02-01 23:05
  • 521

用航班查询系统的实例说明access数据库和viewtree相结合的用法(VB6.0源代码编写)

  • 2009-06-18 17:23
  • 613KB
  • 下载

Android图形用户界面开发之ViewTree和DecorView详细介绍

图形用户界面(GUI)是Android应用程序开发不可或缺的一部分。其不仅能为用户提供输入,还能够根据(用户)执行的动作,提供相应的反馈。因此,作为开发人员,能够理解UI(用户界面)是如何创建以及跟新...
  • LVXIANGAN
  • LVXIANGAN
  • 2014-04-01 11:02
  • 2216
    个人资料
    • 访问:35518次
    • 积分:1686
    • 等级:
    • 排名:千里之外
    • 原创:130篇
    • 转载:38篇
    • 译文:0篇
    • 评论:9条
    最新评论