PhoneWindow,ViewRoot,Activity之间的大致关系

http://www.nowamagic.net/academy/detail/50160216

在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_PARENTFILL_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对象,接下来怎么具体传递可以慢慢去跟了

时间: 2024-10-24 13:34:57

PhoneWindow,ViewRoot,Activity之间的大致关系的相关文章

通过setSystemUiVisibility实现状态栏跟Activity之间的位置关系

以前说到去除状态栏和标题栏总会用到动态代码的方式实现: getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN , WindowManager.LayoutParams. FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); 但是在项目开发中,在收集资料时突然找到了一个很好用的API,这个API是 setSystemUiVisibility();

kbit和bit之间的换算关系

网络速率:用Kbps   Mbps   Gbps   或   Kb.   Mb.   Gb等来表示   1Gbps=1000Mbps   1Mbps=1000Kbps   1Kbps=1000bit 数据传输速率:用KBps   MBps   或KB.MB   .GB等来表示   1GB=1024MB   1MB=1024KB   1KB=1024Byte 1Byte=8bit 1kbps=1000bps 全称 :Bits   Per   Second 通信线路等数据传送速度的单位.比特每秒.1

Android Bundle类,通过bundle实现在两个activity之间的通讯

根据google官方的文档(http://developer.android.com/reference/android/os/Bundle.html) Bundle类是一个key-value对,“A mapping from String values to various Parcelable types.” 类继承关系: java.lang.Object     android.os.Bundle Bundle类是一个final类:public final classBundleexten

Android activity之间传值

当对Android有一些了解后,不难发现,Android程序UI框架接近于Web页面的概念.每一个用于呈现页面的组件,Activity,都是彼此独立的,它们通过系统核心来调度整合,彼此之间的通过Intent机制来串联. 每一种架构都会有其利弊,Android当然也不能超然脱俗.由于Activity之间的松耦合关系,使得其复用能力特别的出色,Mash-Up方式可以有效的提高开发效率.但另一方面,由于Activity过于的独立,它们之间的数据共享,成为一个麻烦的事情. 一 基于消息的传输 最标准的A

从0系统学Android-2.3使用 Intent 在 Activity 之间穿梭

2.3 使用 Intent 在 Activity 之间穿梭 在上一节中我们已经学会了如何创建一个 Activity 了.对于一个应用程序来说,肯定不可能只有一个 Activity.下面就来学习多个 Activity 是专门跳转的. 2.3.1 使用显式 Intent 对于创建 Activity 的过程我们已经很熟悉了,下面快速的创建第二个 Activity.取名 SecondActivity.好了第二个 Activity 已经创建好了,创建好了 Activity 后不要忘了需要在 Android

手动创建Maven项目并建立两个项目之间的依赖关系

用命令行快速建立maven项目 -> mvn:archetype:generate -> 直接回车或者自己输入你想生成的 -> groupId ->artifactId ->如果有默认值回车即可 最后 y 确认创建 我们看下他的目录结构 项目名: src ->main ->java ->test ->java pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0"

2016.02.20 学习笔记 数据在Activity之间的传递的情况

情况一:一个Activity跳转到另一个Activity时,将第一个Activity的数据传递到第二个Activity里面. 分析:当一个界面跳转到另一个界面的同时还要讲数据传递过去,这种情况需要用Intent类putExtra()方法实现. 具体在Onclick方法中的样例代码如下: Intent i1=new Intent(this,SecondActivity.class); String Message=Edit1.getText().toString(); i1.putExtra("M

Android之Activity之间传递对象

在很多时候,我们需要在Activity之间传递对象,比如当你点击了某列表的item,需要传递给下一个Activity该对象,那我们需要该怎么做呢? Android支持两种传递对象的方式,一种是bundle.putSerializable方式,一种是bundle.putParcelable. 那么下面我们就用一个例子来实践Activity传递对象: 1.首先建立两个类,一个Teacher类表示老师,一个Student类表示学生.内容分别如下: <span style="font-size:1

【Android】多个Activity之间利用bundle传递数值

安卓中的Activity相当于vb,mfc中的窗体,在多个Activity之间传递数据是一个相当核心的功能.下面举个例子来说明这个问题. 一.基本目标 用户在两个输入框中输入用户名.密码之后,跳到另一个Activity当中,显示其输入的内容, 然后这两个Activity能够轻松跳转. 二.制作过程 1.首先MainActivity的登录界面是沿用了<[Android]利用表格布局,Android中xml文件与java的交互制作登录界面>(点击打开链接)的布局,其布局文件activity_mai