`

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

分享到:
评论

相关推荐

    Android 悬浮Activity ( Dialog风格)

    在Android开发中,"悬浮Activity"通常指的是一个可以悬浮在其他应用之上,类似Dialog样式但功能更为丰富的Activity。这样的设计可以提供用户一种便捷的方式访问或操作应用,而无需完全退出当前正在使用的应用。悬浮...

    Android深入理解Activity!

    Activity是Android应用开发中的核心组件之一,它是用户与应用程序交互的窗口。深入理解Activity,意味着我们需要探讨它的生命周期、启动模式、栈管理、Intent传递、UI更新以及与其他组件(如Service、...

    android启动以及activity生命周期分析

    `Activity`是Android四大组件之一,它代表了一个屏幕界面。每一个Activity都有自己的生命周期,由一系列回调方法组成,这些方法会在特定的时间点被调用。 - **newActivity**: 在`ActivityThread`内部调用,用于创建...

    android中设置activity的出现方式

    这涉及到Android的窗口动画(Window Animation)和场景过渡(Transition)。在本篇文章中,我们将深入探讨如何实现这一功能。 首先,Android中的窗口动画是指当Activity进入或退出屏幕时显示的视觉效果。这可以通过...

    android中的窗口activity高级应用

    **Translucence Window**(半透明窗口)是Android 5.0(Lollipop)引入的新特性,它允许Activity的背景变得半透明,从而实现过渡效果和沉浸式体验。通过设置Window的属性,如FLAG_TRANSLUCENT_STATUS和FLAG_...

    Activity之间以及fragment之间跳转 共享元素动画实现

    在Android应用开发中,UI交互的流畅性和用户体验密切相关,而Activity和Fragment之间的跳转以及共享元素动画正是提升这种体验的重要手段。本篇文章将详细讲解如何在Android中实现Activity与Fragment之间的平滑过渡...

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

    在Android系统中,WindowManager服务负责管理所有应用的窗口,而Activity实际上就是一种特殊的Window。默认情况下,Activity会全屏显示,但我们可以通过修改Activity的属性和使用自定义布局来改变这一行为。 1. ...

    Android的Window类

    ### Android的Window类详解 #### 一、概述 在Android开发过程中,`Window`类扮演着极其重要的角色,它主要用于管理应用程序的用户界面。本文将深入探讨`Window`类的相关属性与方法,帮助开发者更好地理解如何在...

    android仿window计算器

    在Android平台上开发一款仿Windows计算器应用,涉及到许多关键的Android编程知识和技术,包括用户界面设计、事件处理、数值计算...这个项目涵盖了Android开发的多个方面,对于学习和提升Android编程技能非常有帮助。

    完美实现将activity作为dialog弹窗进行弹出

    在Android开发中,有时我们可能需要将一个Activity展示为Dialog样式,以便于用户交互,比如在主界面之上显示一个半透明、大小可调整的小窗口。本文将深入探讨如何完美实现将Activity作为Dialog弹窗进行弹出,并且...

    Window 内部机制(Activity+Toast)

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

    android窗口式activity

    在Android系统中,Activity是应用程序的基本构建块,它代表了一个用户可以交互的界面。"窗口式Activity"这个术语通常指的是那些具有独立显示区域,能够浮动于其他应用之上或与主屏幕并行存在的Activity。这样的...

    Android夜间模式实现,通过在window上加一层半透明的View

    在Android中,每个Activity都与一个Window对应,它是一个抽象层,负责处理显示内容和用户交互。我们可以通过设置Window的属性来改变应用的视觉效果,例如背景颜色、透明度等。 要实现夜间模式,我们需要做以下几步...

    Android高级应用源码-Activity实现透明的最简洁Demo.zip

    在Android中,使Activity变得透明涉及到对主题(Theme)和窗口(Window)属性的设置。Android提供了多种方式来实现这一效果,而这个Demo可能演示了其中最简单的方法。以下是一些关键的知识点: 1. **主题设置**:在...

    Android activity中间弹框

    在Android开发中,Activity是应用程序的基本构建块,它代表了用户可以交互的屏幕...在阅读提供的博客文章《Android:使用Activity制作中间弹窗》后,开发者可以结合本文中的知识点进行实践,进一步理解和掌握这一技术。

    Android代码-Activity实现透明的最简洁Demo.zip

    在Android开发中,Activity是应用程序的基本组件,用于展示用户界面并处理用户交互。透明Activity能够为用户提供更加沉浸式和独特的视觉体验。本示例“Android代码-Activity实现透明的最简洁Demo”旨在演示如何轻松...

    详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    总之,`SYSTEM_ALERT_WINDOW`权限在Android全局对话框的实现中起着至关重要的作用,但开发者也应灵活运用不同的策略来应对权限限制和设备差异。在处理这类问题时,不仅要有扎实的Android框架知识,还要对用户体验有...

    android webview中html页面点击按钮跳转到activity

    在Android开发中,Webview是一个非常重要的组件,它允许我们加载和显示网页内容。当我们需要在Webview中实现HTML页面与原生Android应用的交互时,例如点击HTML按钮跳转到一个新的Activity,就需要利用到JavaScript...

Global site tag (gtag.js) - Google Analytics