- 浏览: 66488 次
- 性别:
- 来自: 杭州
文章分类
最新评论
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 902一篇关于Handler的文章,写的非常详细,收藏! -
Android UI Pattern中的开源项目
2013-04-22 11:00 01. ListView 1.1 Refreshab ... -
AsyncTask
2013-04-18 20:57 837下面的内容翻译自 ... -
Intent机制
2013-04-16 21:51 0一天突然回过 -
AIDL跨进程调用学习笔记
2013-04-11 10:08 1638该学习笔记根据一个网友的例子整理而成。 ... -
AIDL学习笔记
2013-03-29 15:53 0双方的规划司法官 -
利用适配器构建Android界面布局(layout)
2013-03-22 10:26 733如果你的界面布局的内容是动态的或者不是预先设定的, ... -
如何调用Android系统图库中选择图片(转)
2013-03-06 15:27 1194如何调用Android系统图库中选择图片:点击 ... -
Android中ListView的优化
2012-12-10 10:39 0ListView... -
如何在Android项目中引入第三方JAR包
2012-11-18 14:04 6771.在项目的根目录下建立libs目录,然后将你需要的第三方JA ... -
Android 模拟键盘鼠标事件(Socket+Instrumentation实现)
2012-03-06 15:47 1232通过Socket + Instrumentation实现模 ... -
在Android 工程中的 R.java 文件丢失后 ---如何重新生成
2012-03-07 19:24 784方法:右击你的工程(项目)——>Android Tool ... -
如何在一个Service中启动一个Activity
2012-03-10 11:12 1273Intent intent = new Intent(Serv ... -
Android Toast大全(五种情形)建立属于你自己的Toast
2012-03-13 11:51 591Toast用于向用户显示一些帮助/提示。下面我做了5中效 ... -
实现Android手机(服务端)与PC(客户端)实现通信
2012-03-13 15:07 1347本文在此基础上做了一 ... -
Android中如何使用WIFI来连接ADB
2012-04-01 17:00 694有的时候,我们限于种种原因,无法使用USB来连接设备进行调 ... -
Android_Launcher详解
2012-11-15 20:22 0Launcher的定义
相关推荐
然后通过startActivity(String id, Intent intent)这个方法获取Window获取当前Window对象,再然后调用getDecorView()方法获取当前activity对应的view,这样就可以使用addView(View child)方法添加到activity中。
在本文中,我们就将详细分析Android应用程序窗口对象的创建过程。为了方便接下来描述类型为PhoneWindow的应用程序窗口的创建过程,我们将这两个图拿过来,如以下的图1和图2所示:图1Activity和Win
Android 中 android.view.WindowLeaked的解决办法 按字面了解,Window Leaked大概就是说一个窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏呢? 产生原因: 我们知道Android的每一个Activity都有个...
Window表示一个窗口的概念,Window是...Android中,所有的视图都是通过Window来呈现,不管是Activity、Dialog、还是Toast,它们的视图实际上都是附加在Window上,因此Window是实际View的直接管理者,单击事件由Window传
Android 中的每个窗口 View 都有一个对应的 Window,例如 Activity、Dialog,在他们初始化的时候就会为其创建对应的PhoneWindow 并赋值到其内部的一个引用 window 的层级 WindowLayoutParams.setType 设置
Activity设置全屏和无标题栏,要用到andorid.view.Window和Android.view.WindowManager。 Window.FEATURE_NO_TITLE表示无标题栏。 WindowManager.LayoutParams.FLAG_FULLSCREEN表示全屏。 具体用法如下: 1、设置...
在开发中我们经常需要把我们的应用设置为全屏,有两种方法... import android.view.Window; import android.view.WindowManager; public class OpenGl_Lesson1 extends Activity { public void onCreate(Bundle sa
弹框在Android项目中经常出现,常见的实现方法有三种:Dialog 弹框,Window弹框,Activity伪弹框。本文就说一说三种弹框的实现及在项目中的运用。 二丶演示图 图一为常见的三种弹框(文末上链接),图二为项目中...
注意:PopupWindow组件的使用问题,PopupWindow是一个阻塞对话框,如果你直接在Activity创建的方法中显示它,则会报错:android.view.WindowManager$BadTokenException:Unable to add window -- token null is not ...
2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / 39 2.3 IPC基础概念介绍 / 42 2.3.1 Serializable接口 / 42 2.3.2 Parcelable接口 / 45 2.3.3 Binder / 47 ...
2.2 Android中的多进程模式 36 2.2.1 开启多进程模式 36 2.2.2 多进程模式的运行机制 39 2.3 IPC基础概念介绍 42 2.3.1 Serializable接口 42 2.3.2 Parcelable接口 45 2.3.3 Binder 47 2.4 Android中的IPC...
Android系统采用一种称为Surface的UI架构为应用程序提供用户...这个PPT讲Android应用程序的Surface机制,阐述Activity、Window和View的关系,以及应用程序、WindowManagerService和SurfaceFlinger协作完成UI渲染的过程
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
16 1.2.2 Activity的Flags / 27 1.3 Intent Filter的匹配规则 / 28 第2章 IPC机制 / 35 2.1 Android IPC简介 / 35 2.2 Android中的多进程模式 / 36 2.2.1 开启多进程模式 / 36 2.2.2 多进程模式的运行机制 / ...
import android.view.Window; import android.widget.ImageView; public class MyMultitouchDemo extends Activity { private static final int SCALEBASIC = 3 ;// 调整的比率 private int imageX = 0 ; // 计算...
本文实例讲述了Android开发中获取View视图宽与高的常用方法。分享给大家供大家参考,具体如下: 一、根据WindowManager管理器获得 1)这两种方法在屏幕未显示的时候,还是处于0的状态,即要在setContentView调用之后...
View的,即隧道式传递,2而View又分为不包含子 View的View以及包含子View的ViewGroup,事件产生之后首先传递到Activity上面,而Activity接着会传递到 PhoneWindow上,PhoneWindow会传递给RootView,而RootView其实...
import android.view.Window; import android.view.WindowManager; import android.view.View.OnTouchListener; import android.widget.FrameLayout; import android.widget.ImageView; public class ...