`

Android学习 之 Activity和Window之间的关系

 
阅读更多

第一部分

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

 

android里,我们都知道activity.但是一个activity跟一个Window是一个什么关系呢?

 

activity.java中,我们可以看到两个变量,分别是:

private Window mWindow;

 

private WindowManager mWindowManager;

 

这这个变量是在哪里赋值的呢?可以看到attach函数,

 

mWindow = PolicyManager.makeNewWindow(this);

 

跟进去看一下,可以发现返回的时候一个PhoneWindow对象,PhoneWindowWindow类的派生类。

mWindow.setWindowManager(null, mToken, mComponent.flattenToString());

if (mParent != null) {

mWindow.setContainer(mParent.getWindow());

}

mWindowManager = mWindow.getWindowManager();

 

仔细跟踪下这段代码中我们可以得到WindowManager对象,并且这个对象是在系统唯一的,这个对象同样被赋值给PhoneWindow的成员变量。

 

我们在新建一个activity的时候,往往喜欢用如下的代码来定义该activityUI界面,那么这个具体的实现是怎么来实现的呢?

 

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这个类在androidUI结构中扮演的是一个中间者的角色,连接的是PhoneWindowWindowManagerService.

WindowManagerService中我们知道它读取android系统里所有事件,键盘事件,轨迹球事件等等,它怎么分发到各个activity的呢?就是通过这个ViewRoot

在每个PhoneWindow创建的时候,系统都会向WindowManger中的一个保存View数组增加PhoneWindowDecorView对象,WindowManger在保存好这个View对象的同时,也会新创建一个ViewRoot对象用来沟通WindowManagerService

可以查看WindowManagerImplViewRoot中的代码,同时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则是PhoneWindowDecorView对象,接下来怎么具体传递可以慢慢去跟了。。。

 

转自: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

分享到:
评论

相关推荐

    Window 内部机制(Activity+Toast)

    描述了window的基本工作原理以及 Activity 和 Toast 使用的基本实现源码大概分析

    Android应用程序窗口(Activity)的窗口对象(Window)

    每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象...为了方便接下来描述类型为PhoneWindow的应用程序窗口的创建过程,我们将这两个图拿过来,如以下的图1和图2所示:图1Activity和Win

    JAVA+android学习思维导图.7z

    JAVA学习资料思维导图,主要包括以下内容: 一、JAVA部分 1、GUI(Abstract Window Tookit).mmap 2、Java中的注解.mmap 3、Java网络编程.mmap 4、Java中的反射.mmap 5、Java中级总结.mmap 6、Swing和事件处理.mmap 7...

    Android应用程序窗口(Activity)窗口对象(Window)创建指南

    在前文中,我们分析了Android应用程序窗口的运行上下文... 从前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划一文可以知道,在PHONE平台上,与Activity组件所关联的窗口对象的实际类型为PhoneWindow

    Android编程设定activity进入和退出效果的方法

    本文实例讲述了Android编程设定activity进入和退出效果的方法。分享给大家供大家参考,具体如下: 看了android的源代码和资源文件,终于明白如何去修改设置Dialog和Activity的进入和退出效果了。设置Dialog首先通过...

    随意调节你的activity的大小,activity 自定义窗口大小

    NULL 博文链接:https://woshiwzy.iteye.com/blog/830755

    Android代码-cordova调用安卓原生activity插件

    cordova-plugins-activity ...原生安卓activity接收参数和回传参数简单示例 public class MyActivity extends Activity { private Button btn; private int flag = 0; private Intent intent = null;

    android activity设置无标题实现全屏

    Activity设置全屏和无标题栏,要用到andorid.view.Window和Android.view.WindowManager。 Window.FEATURE_NO_TITLE表示无标题栏。 WindowManager.LayoutParams.FLAG_FULLSCREEN表示全屏。 具体用法如下: 1、设置...

    深入理解Android中的Window和WindowManager

    Window表示一个窗口的概念,Window是...Android中,所有的视图都是通过Window来呈现,不管是Activity、Dialog、还是Toast,它们的视图实际上都是附加在Window上,因此Window是实际View的直接管理者,单击事件由Window传

    Android代码-android-advanced-decode

    《Android进阶解密》源码 源码目录介绍 目录 简介 ...第1章介绍Android系统架构、系统源码目录和如何阅读源码,带领大家走进Android...第7章介绍WindowManager,包括WindowManager的关联类、Window的属性和Window

    Android应用程序窗口(Activity) · 老罗的Android之旅(总结) · 看云1

    Android应用程序窗口(Activity)实现框架简要介绍和学习计划运行上下文环境(Context)的创建过程分析窗口对象(Window)的创建过程分析视图

    不依赖于Activity的Android全局悬浮窗的实现

    前言 当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可...通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象。 每一个WindowManager对象

    Android中Window的管理深入讲解

    Window 表示一个窗口的概念,是一个抽象的概念,每一个 Window 都对应一个 View 和一个 ViewRootImpl,Window 和 View 通过 ViewRootImpl 来建立联系,因此 Window 并不是实际存在的,它是以 View 的形式存在。...

    将一个activity转换成一个view并显示

    LocalActivityManager类是管理activity的,然后通过startActivity(String id, Intent intent)这个方法获取Window获取当前Window对象,再然后调用getDecorView()方法获取当前activity对应的view,这样就可以使用...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    Android设置theme中可能遇到的坑

    This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR 原因一 错误写法: <style name=AppTheme.NoActionBar> <item name=android:...

    android dialog与popwindow之间的简单运用

    注意:PopupWindow组件的使用问题,PopupWindow是一个阻塞对话框,如果你直接在Activity创建的方法中显示它,则会报错:android.view.WindowManager$BadTokenException:Unable to add window -- token null is not ...

    老罗android开发视频教程全集百度网盘下载

    Android以Java为编程语言,使接口到功能,都有层出不穷的变化,其中Activity等同于J2ME的MIDlet,一个 Activity 类(class)负责创建视窗(window),一个活动中的Activity就是在 foreground(前景)模式,背景运行...

    Android开发艺术探索

    4.2.2 Measure Spec和Layout Params的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 4.3.2 layout过程 / 193 4.3.3 draw过程 / 197 4.4 自定义View / 199 4.4.1 自定义View的分类 ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层...

Global site tag (gtag.js) - Google Analytics