- 浏览: 68820 次
- 性别:
- 来自: 杭州
文章分类
最新评论
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图:
发表评论
-
Handler,Message和Looper(转)
2013-04-22 13:52 997一篇关于Handler的文章,写的非常详细,收藏! -
Android UI Pattern中的开源项目
2013-04-22 11:00 01. ListView 1.1 Refreshab ... -
AsyncTask
2013-04-18 20:57 874下面的内容翻译自 ... -
Intent机制
2013-04-16 21:51 0一天突然回过 -
AIDL跨进程调用学习笔记
2013-04-11 10:08 1691该学习笔记根据一个网友的例子整理而成。 ... -
AIDL学习笔记
2013-03-29 15:53 0双方的规划司法官 -
利用适配器构建Android界面布局(layout)
2013-03-22 10:26 776如果你的界面布局的内容是动态的或者不是预先设定的, ... -
如何调用Android系统图库中选择图片(转)
2013-03-06 15:27 1266如何调用Android系统图库中选择图片:点击 ... -
Android中ListView的优化
2012-12-10 10:39 0ListView... -
如何在Android项目中引入第三方JAR包
2012-11-18 14:04 7061.在项目的根目录下建立libs目录,然后将你需要的第三方JA ... -
Android 模拟键盘鼠标事件(Socket+Instrumentation实现)
2012-03-06 15:47 1265通过Socket + Instrumentation实现模 ... -
在Android 工程中的 R.java 文件丢失后 ---如何重新生成
2012-03-07 19:24 812方法:右击你的工程(项目)——>Android Tool ... -
如何在一个Service中启动一个Activity
2012-03-10 11:12 1320Intent intent = new Intent(Serv ... -
Android Toast大全(五种情形)建立属于你自己的Toast
2012-03-13 11:51 627Toast用于向用户显示一些帮助/提示。下面我做了5中效 ... -
实现Android手机(服务端)与PC(客户端)实现通信
2012-03-13 15:07 1387本文在此基础上做了一 ... -
Android中如何使用WIFI来连接ADB
2012-04-01 17:00 727有的时候,我们限于种种原因,无法使用USB来连接设备进行调 ... -
Android_Launcher详解
2012-11-15 20:22 0Launcher的定义
相关推荐
在Android开发中,"悬浮Activity"通常指的是一个可以悬浮在其他应用之上,类似Dialog样式但功能更为丰富的Activity。这样的设计可以提供用户一种便捷的方式访问或操作应用,而无需完全退出当前正在使用的应用。悬浮...
在Android中,每个Activity都与一个Window对应,它是一个抽象层,负责处理显示内容和用户交互。我们可以通过设置Window的属性来改变应用的视觉效果,例如背景颜色、透明度等。 要实现夜间模式,我们需要做以下几步...
在Android开发中,Activity是应用程序的基本构建块,它充当用户界面的窗口。本文将深入探讨“Android中的窗口Activity高级应用”,包括对`Activity action`、`ActivityGroup`以及相关的技术点进行详细的阐述。 首先...
在Android框架的核心部分,`Window`类位于`frameworks\base\core\java\android\view\Window.java`文件中。该文件连同注释一起约有一千多行代码,其中涵盖了`Window`类的基本属性和核心功能。 #### 三、Window类的...
在Android开发中,Activity是应用程序的基本组件,它负责与用户交互并展示UI。当我们谈论“设置Activity的出现方式”时,我们实际上是在讨论如何自定义Activity的启动动画和过渡效果。这涉及到Android的窗口动画...
在Android系统中,WindowManager服务负责管理所有应用的窗口,而Activity实际上就是一种特殊的Window。默认情况下,Activity会全屏显示,但我们可以通过修改Activity的属性和使用自定义布局来改变这一行为。 1. ...
在Android开发过程中,理解应用程序如何启动及Activity的生命周期是非常重要的。这不仅有助于我们更好地管理程序的状态,还能帮助我们在遇到内存泄漏等问题时进行快速定位和解决。 #### ActivityThread `...
在Android应用开发中,UI交互的流畅性和用户体验密切相关,而Activity和Fragment之间的跳转以及共享元素动画正是提升这种体验的重要手段。本篇文章将详细讲解如何在Android中实现Activity与Fragment之间的平滑过渡...
然后通过startActivity(String id, Intent intent)这个方法获取Window获取当前Window对象,再然后调用getDecorView()方法获取当前activity对应的view,这样就可以使用addView(View child)方法添加到activity中。
在Android开发中,Activity是应用的基本组件,用于与用户交互并展示内容。当我们需要实现一个自定义的下拉选择列表时,通常会涉及到对UI组件的定制和触摸事件的处理。下面将详细介绍如何在Android的Activity中创建...
本文将深入探讨Android中的`Window`类及其相关特性,帮助开发者更好地理解其工作原理以及如何在实际应用中使用。 #### 二、Window类介绍 `Window`类是Android框架提供的一个核心类,用于管理一个应用窗口的所有...
当我们需要在Webview中实现HTML页面与原生Android应用的交互时,例如点击HTML按钮跳转到一个新的Activity,就需要利用到JavaScript接口和Android的WebViewClient。下面我们将详细探讨这一过程。 首先,我们需要在...
10. Android组件通信:WindowView可能涉及到Activity、Fragment、Service等组件间的通信,如Intent的使用,BroadcastReceiver的注册与接收,以及使用FragmentTransaction进行Fragment的管理。 总之,WindowView的...
在Android系统中,Window并非直接与用户界面的View元素等价,而是作为承载View的容器。本文将深入探讨Android中Window添加View的底层原理,包括Window和WindowManager的概念、交互方式以及添加View的关键步骤。 ...
在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。为了方便接下来描述类型为PhoneWindow的应用程序窗口的创建过程,我们将这两个图拿过来,如以下的图1和图2所示:图1Activity和Win
Android 中 android.view.WindowLeaked的解决办法 按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个...
在 Android 中,每个窗口 View 都有一个对应的 Window,例如 Activity、Dialog,在它们初始化的时候就会为其创建对应的 PhoneWindow 并赋值到其内部的一个引用。 Window 的层级是通过 WindowLayoutParams 的 ...
在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中加载和显示网页内容。WebView不仅能够呈现HTML、CSS和JavaScript,还支持与原生Android应用程序的交互,从而实现混合式应用开发。在这个主题...
本压缩包提供的资料是关于如何在Android系统中实现夜间模式的一种方法,即通过在窗口(Window)上添加一层半透明的View来达到效果。下面将详细阐述这一实现方式。 首先,理解Android窗口(Window)的概念至关重要。...
本文将深入探讨如何实现JS与Android Activity之间的通信。 一、WebView的使用 首先,我们需要在布局XML文件中添加一个WebView控件,如下所示: ```xml android:id="@+id/web_view" android:layout_width=...