`

Android中Activity,View,Window之间的关系

阅读更多

1.首先来看Activity中的attach()方法,在调用onCreate()之前会调用attach(),在这里我们先不管是谁调用这个方法。下面来看一下代码片段(Activity.java):

 

// attach()中的一个语句,返回一个Window对象
mWindow = PolicyManager.makeNewWindow(this);

 

 从上面可以看到attach()方法调用PolicyManager.makeNewWindow(this),得到了一个Window对象(实际上是PhoneWindow对象,Window是一个抽象类),而PolicyManager则利用Policy中的makeNewWindow()方法返回一个PhoneWindow对象。请看下面的代码片段(PolicyManager.java):

 

// sPolicy为Policy对象,实现了接口IPolicy
    public static Window makeNewWindow(Context context) {
        return sPolicy.makeNewWindow(context);
    }

 

 再看下面的代码(Policy.java):

 

// 这里就是返回了一个PhoneWindow对象
public PhoneWindow makeNewWindow(Context context) {
        return new PhoneWindow(context);
    }
 

 

所以,在一个Activity构造的时候,一定会构造一个Window对象,并且只有一个。上面的一些代码就是实例化了一个Window。Window对象的作用下面会提到。


2.下面我们来看setContentView()方法,这是它的代码片段(Activity.java,有三个重载的方法):

 

 /**
     * Set the activity content from a layout resource.  The resource will be
     * inflated, adding all top-level views to the activity.
     * 
     * @param layoutResID Resource ID to be inflated.
     */
    public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
    }

    /**
     * Set the activity content to an explicit view.  This view is placed
     * directly into the activity's view hierarchy.  It can itself be a complex
     * view hierarhcy.
     * 
     * @param view The desired content to display.
     */
    public void setContentView(View view) {
        getWindow().setContentView(view);
    }

    /**
     * Set the activity content to an explicit view.  This view is placed
     * directly into the activity's view hierarchy.  It can itself be a complex
     * view hierarhcy.
     * 
     * @param view The desired content to display.
     * @param params Layout parameters for the view.
     */
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        getWindow().setContentView(view, params);
    }

从上面的代码中可以知道,这三个重载的方法,都是调用了getWindow().setContentView(),而getWindow()方法就是返回一个Window对象(就是前面attach得到的一个PhoneWindow对象,引用变量是mWindow),接下来我们定位到PhoneWindow中(PhoneWindow.java):

 

 
// 跟Activity中的三个重载方法是意义对应的
@Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mLayoutInflater.inflate(layoutResID, mContentParent);
        final Callback cb = getCallback();
        if (cb != null) {
            cb.onContentChanged();
        }
    }

    @Override
    public void setContentView(View view) {
        setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mContentParent.addView(view, params);
        final Callback cb = getCallback();
        if (cb != null) {
            cb.onContentChanged();
        }
    }

 在上面三个方法中,我们要看是两个引用变量:mContentParent,mLayoutInflater。分别是ViewGroup对象和LayoutInflater对象。这个是mContentParent就是Winodw的ViewRoot(根视图,这是逻辑性的根视图,实际就是View或ViewGroup),通过mContentParent.addView()来添加各种View,达到我们所要的效果。其实,Activity就是一个控制单元,而Window本身不是一个视图(View),Window就是一个承载模型,而View才是真正的显示视图。而LayoutInflater的作用是把资源文件(布局文件)加载成一个View(使用LayoutInflaterd的inflate(int resource, ViewGroup root)方法)。

 

3.WindowManagerService接受的消息,并且回调Activity函数,onKeyDown()....

 

4.如何动态的添加一个layout并且显示出来,请看下面的代码片段:

 

	
// 这里跳过了Activity的setContentView()方法
	getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null));
 

下面再传一张UML图:

 

 

分享到:
评论

相关推荐

    Android 悬浮Activity ( Dialog风格)

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

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

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

    android中的窗口activity高级应用

    在Android开发中,Activity是应用程序的基本构建块,它充当用户界面的窗口。本文将深入探讨“Android中的窗口Activity高级应用”,包括对`Activity action`、`ActivityGroup`以及相关的技术点进行详细的阐述。 首先...

    Android的Window类详解

    在Android框架的核心部分,`Window`类位于`frameworks\base\core\java\android\view\Window.java`文件中。该文件连同注释一起约有一千多行代码,其中涵盖了`Window`类的基本属性和核心功能。 #### 三、Window类的...

    android中设置activity的出现方式

    在Android开发中,Activity是应用程序的基本组件,它负责与用户交互并展示UI。当我们谈论“设置Activity的出现方式”时,我们实际上是在讨论如何自定义Activity的启动动画和过渡效果。这涉及到Android的窗口动画...

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

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

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

    在Android开发过程中,理解应用程序如何启动及Activity的生命周期是非常重要的。这不仅有助于我们更好地管理程序的状态,还能帮助我们在遇到内存泄漏等问题时进行快速定位和解决。 #### ActivityThread `...

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

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

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

    然后通过startActivity(String id, Intent intent)这个方法获取Window获取当前Window对象,再然后调用getDecorView()方法获取当前activity对应的view,这样就可以使用addView(View child)方法添加到activity中。

    android 使用activity自定义下拉选择列表

    在Android开发中,Activity是应用的基本组件,用于与用户交互并展示内容。当我们需要实现一个自定义的下拉选择列表时,通常会涉及到对UI组件的定制和触摸事件的处理。下面将详细介绍如何在Android的Activity中创建...

    Android的Window类

    本文将深入探讨Android中的`Window`类及其相关特性,帮助开发者更好地理解其工作原理以及如何在实际应用中使用。 #### 二、Window类介绍 `Window`类是Android框架提供的一个核心类,用于管理一个应用窗口的所有...

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

    当我们需要在Webview中实现HTML页面与原生Android应用的交互时,例如点击HTML按钮跳转到一个新的Activity,就需要利用到JavaScript接口和Android的WebViewClient。下面我们将详细探讨这一过程。 首先,我们需要在...

    WindowView-一款强大的Android源码.rar

    10. Android组件通信:WindowView可能涉及到Activity、Fragment、Service等组件间的通信,如Intent的使用,BroadcastReceiver的注册与接收,以及使用FragmentTransaction进行Fragment的管理。 总之,WindowView的...

    Android中Window添加View的底层原理

    在Android系统中,Window并非直接与用户界面的View元素等价,而是作为承载View的容器。本文将深入探讨Android中Window添加View的底层原理,包括Window和WindowManager的概念、交互方式以及添加View的关键步骤。 ...

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

    在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。为了方便接下来描述类型为PhoneWindow的应用程序窗口的创建过程,我们将这两个图拿过来,如以下的图1和图2所示:图1Activity和Win

    Android 中 android.view.WindowLeaked的解决办法

    Android 中 android.view.WindowLeaked的解决办法 按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个...

    Android中Window的管理深入讲解

    在 Android 中,每个窗口 View 都有一个对应的 Window,例如 Activity、Dialog,在它们初始化的时候就会为其创建对应的 PhoneWindow 并赋值到其内部的一个引用。 Window 的层级是通过 WindowLayoutParams 的 ...

    webview+html跳转activity

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。WebView不仅能够呈现HTML、CSS和JavaScript,还支持与原生Android应用程序的交互,从而实现混合式应用开发。在这个主题...

    安卓换肤主题更换夜间模式相关-Android夜间模式实现通过在window上加一层半透明的View.rar

    本压缩包提供的资料是关于如何在Android系统中实现夜间模式的一种方法,即通过在窗口(Window)上添加一层半透明的View来达到效果。下面将详细阐述这一实现方式。 首先,理解Android窗口(Window)的概念至关重要。...

    Js与Android Activity交互代码

    本文将深入探讨如何实现JS与Android Activity之间的通信。 一、WebView的使用 首先,我们需要在布局XML文件中添加一个WebView控件,如下所示: ```xml android:id="@+id/web_view" android:layout_width=...

Global site tag (gtag.js) - Google Analytics