第一部分
Android PhoneWindow,ViewRoot,Activity之间的大致关系。
在android里,我们都知道activity.但是一个activity跟一个Window是一个什么关系呢?
在activity.java中,我们可以看到两个变量,分别是:
private Window mWindow;
private WindowManager mWindowManager;
这这个变量是在哪里赋值的呢?可以看到attach函数,
mWindow = PolicyManager.makeNewWindow(this);
跟进去看一下,可以发现返回的时候一个PhoneWindow对象,PhoneWindow是Window类的派生类。
mWindow.setWindowManager(null, mToken, mComponent.flattenToString());
if (mParent != null) {
mWindow.setContainer(mParent.getWindow());
}
mWindowManager = mWindow.getWindowManager();
仔细跟踪下这段代码中我们可以得到WindowManager对象,并且这个对象是在系统唯一的,这个对象同样被赋值给PhoneWindow的成员变量。
我们在新建一个activity的时候,往往喜欢用如下的代码来定义该activity的UI界面,那么这个具体的实现是怎么来实现的呢?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
我们跟踪setContentView就知道了。可以发现activity其实把这个操作交给了自己的mWindow来完成,通过跟踪PhoneWindow中的setContentView函数可以得出以下知识:
1,每一个PhoneWiondow中都有一个叫DecorView的对象,该对象是该PhoneWiondow的框架view,可以找到这么一段代码:
View in = mLayoutInflater.inflate(layoutResource, null);
decor.addView(in, new ViewGroup.LayoutParams(FILL_PARENT, FILL_PARENT));
该layoutResource则是资源ID,通过往上翻代码就可以找得到。
2,一个PhoneWiondow中都有一个叫FrameLayout的对象mContentParent,该对象是从上述layoutResource中的布局xml中获得的,这也将是activity中所有用户新增加view都会被包含在这个对象当中。
总体可以这样大致说明:一个activity包含有一个PhoneWiondow对象,而所有的UI部件都是放在PhoneWiondow中。
|
第二部分
ViewRoot这个类在android的UI结构中扮演的是一个中间者的角色,连接的是PhoneWindow跟WindowManagerService.
WindowManagerService中我们知道它读取android系统里所有事件,键盘事件,轨迹球事件等等,它怎么分发到各个activity的呢?就是通过这个ViewRoot。
在每个PhoneWindow创建的时候,系统都会向WindowManger中的一个保存View数组增加PhoneWindow的DecorView对象,WindowManger在保存好这个View对象的同时,也会新创建一个ViewRoot对象用来沟通WindowManagerService。
可以查看WindowManagerImpl跟ViewRoot中的代码,同时ViewRoot中我们可以看到一个W类型,该类型派生自IWindow.stub可以知道这个可以被用来作远程调用。
res = sWindowSession.add(mWindow, mWindowAttributes,
getHostVisibility(), mAttachInfo.mContentInsets);
IwindowSession则是WindowManagerService中的远程调用接口,上述代码也表明了每创建了一个PhoneWindow,也就创建了一个ViewRoot,并将在WindowManagerService注册。
接下来简单的看下KeyEvent的传递。在WindowManagerService中
focus.mClient.dispatchKey(event);
这个段代码的mClient则就是ViewRoot中的W类型,通过远程调用,可以看看ViewRoot的处理:
boolean handled = mView != null
? mView.dispatchKeyEventPreIme(event) : true;
mView则是PhoneWindow的DecorView对象,接下来怎么具体传递可以慢慢去跟了。。。
转自:http://hi.baidu.com/%D3%B0%D7%D3%B9%FA%B6%C8/blog/item/44881128b234c3f298250a02.html
http://hi.baidu.com/%D3%B0%D7%D3%B9%FA%B6%C8/blog/item/65d4864a24ca50fc83025c1a.html
分享到:
相关推荐
在Android开发中,"悬浮Activity"通常指的是一个可以悬浮在其他应用之上,类似Dialog样式但功能更为丰富的Activity。这样的设计可以提供用户一种便捷的方式访问或操作应用,而无需完全退出当前正在使用的应用。悬浮...
Activity是Android应用开发中的核心组件之一,它是用户与应用程序交互的窗口。深入理解Activity,意味着我们需要探讨它的生命周期、启动模式、栈管理、Intent传递、UI更新以及与其他组件(如Service、...
`Activity`是Android四大组件之一,它代表了一个屏幕界面。每一个Activity都有自己的生命周期,由一系列回调方法组成,这些方法会在特定的时间点被调用。 - **newActivity**: 在`ActivityThread`内部调用,用于创建...
这涉及到Android的窗口动画(Window Animation)和场景过渡(Transition)。在本篇文章中,我们将深入探讨如何实现这一功能。 首先,Android中的窗口动画是指当Activity进入或退出屏幕时显示的视觉效果。这可以通过...
**Translucence Window**(半透明窗口)是Android 5.0(Lollipop)引入的新特性,它允许Activity的背景变得半透明,从而实现过渡效果和沉浸式体验。通过设置Window的属性,如FLAG_TRANSLUCENT_STATUS和FLAG_...
在Android应用开发中,UI交互的流畅性和用户体验密切相关,而Activity和Fragment之间的跳转以及共享元素动画正是提升这种体验的重要手段。本篇文章将详细讲解如何在Android中实现Activity与Fragment之间的平滑过渡...
在Android系统中,WindowManager服务负责管理所有应用的窗口,而Activity实际上就是一种特殊的Window。默认情况下,Activity会全屏显示,但我们可以通过修改Activity的属性和使用自定义布局来改变这一行为。 1. ...
### Android的Window类详解 #### 一、概述 在Android开发过程中,`Window`类扮演着极其重要的角色,它主要用于管理应用程序的用户界面。本文将深入探讨`Window`类的相关属性与方法,帮助开发者更好地理解如何在...
在Android平台上开发一款仿Windows计算器应用,涉及到许多关键的Android编程知识和技术,包括用户界面设计、事件处理、数值计算...这个项目涵盖了Android开发的多个方面,对于学习和提升Android编程技能非常有帮助。
在Android开发中,有时我们可能需要将一个Activity展示为Dialog样式,以便于用户交互,比如在主界面之上显示一个半透明、大小可调整的小窗口。本文将深入探讨如何完美实现将Activity作为Dialog弹窗进行弹出,并且...
描述了window的基本工作原理以及 Activity 和 Toast 使用的基本实现源码大概分析
在Android系统中,Activity是应用程序的基本构建块,它代表了一个用户可以交互的界面。"窗口式Activity"这个术语通常指的是那些具有独立显示区域,能够浮动于其他应用之上或与主屏幕并行存在的Activity。这样的...
在Android中,每个Activity都与一个Window对应,它是一个抽象层,负责处理显示内容和用户交互。我们可以通过设置Window的属性来改变应用的视觉效果,例如背景颜色、透明度等。 要实现夜间模式,我们需要做以下几步...
在Android中,使Activity变得透明涉及到对主题(Theme)和窗口(Window)属性的设置。Android提供了多种方式来实现这一效果,而这个Demo可能演示了其中最简单的方法。以下是一些关键的知识点: 1. **主题设置**:在...
在Android开发中,Activity是应用程序的基本构建块,它代表了用户可以交互的屏幕...在阅读提供的博客文章《Android:使用Activity制作中间弹窗》后,开发者可以结合本文中的知识点进行实践,进一步理解和掌握这一技术。
在Android开发中,Activity是应用程序的基本组件,用于展示用户界面并处理用户交互。透明Activity能够为用户提供更加沉浸式和独特的视觉体验。本示例“Android代码-Activity实现透明的最简洁Demo”旨在演示如何轻松...
总之,`SYSTEM_ALERT_WINDOW`权限在Android全局对话框的实现中起着至关重要的作用,但开发者也应灵活运用不同的策略来应对权限限制和设备差异。在处理这类问题时,不仅要有扎实的Android框架知识,还要对用户体验有...
在Android开发中,Webview是一个非常重要的组件,它允许我们加载和显示网页内容。当我们需要在Webview中实现HTML页面与原生Android应用的交互时,例如点击HTML按钮跳转到一个新的Activity,就需要利用到JavaScript...