其实在 android 中真正展示给用户的是window和view,activity在 android 中所其的作用主要是处理一些逻辑问题,比如生命周期的管理、建立窗口等。在 android 中,窗口的管理还是比较重要的一块,因为他直接负责把内容展示给用户,并和用户进行交互。响应用户的输入等。

在讲窗口管理时,有必要先说下ViewManager这个接口,这个接口主要有以下的实现子接口和实现类,分别是: WindowManager 和ViewGroup里面还有三个重要的方法:

* addView();
* updateViewLayout();
* removeView();

WindowManager 中,addView方法表示的是将主窗口中的顶级view(也就是DecorView)添加到 WindowManager 中,并建立会话。接下来会详细介绍。我们先来看看Window

Window:
Window是 android 中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类,PhoneWindow和MidWindow,我们一般的activity对应的主要是PhoneWindow,在activity中经常使用的setContentView等方法也是在这个里面实现的。

java代码:
@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(); //窗口类容发生变化时更新
}

}


每个主窗口中都有一个View,称之为DecorView,是主窗口中的顶级view(实际上就是ViewGroup),在View中有两个成员变量叫做mParent、mChildren,它是用来管理view的上下级关系的。而ViewGroup是对一组View的管理。因此,在ViewGroup中建立了所有view的关系网。而最终ViewGroup附属在主窗口上。这样就很容易在窗口中通过findViewById找到具体的View了。view中的事件处理也是根据这个路径来处理的。

java代码:
performLaunchActivity( );

handleResumeActivity( );


在performLaunchActivity中,会调用activity.attach方法建立一个window, 在handleResumeActivity方法中启动activity的时候,会将主窗口加入到 WindowManager

java代码:
View decor =r.window.getDecorView(); //获得窗口的顶级View

decor.setVisibility(View.INVISIBLE);

ViewManager wm= a.getWindowManager(); // WindowManager 继承自ViewManager

WindowManager .LayoutParams l =r.window.getAttributes();

a.mDecor = decor;
l.type = WindowManager .LayoutParams.TYPE_BASE_APPLICATION;
l.softInputMode |= forwardBit;
if (a.mVisibleFromClient) {
a.mWindowAdded = true;
wm.addView(decor, l); //实际上是把主窗口的顶级view加入到WindowMangaer
}


WindowManager :

WindowManager 主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。
通过Context.getSystemService(Context.WINDOW_SERVICE)的方式可以获得 WindowManager 的实例.
WindowManager 继承自ViewManager,里面涉及到窗口管理的三个重要方法,分别是:

* addView();
* updateViewLayout();
* removeView();

WindowManager 中还有一个重要的静态类LayoutParams.通过它可以设置和获得当前窗口的一些属性。
我们先来看看addView()方法,在addView中,会利用LayoutParams获得window的View属性,并为每个window创建ViewRoot,ViewRoot是View和 WindowManager 之间的桥梁,真正把View传递给 WindowManager 的是通过ViewRoot的setView()方法,ViewRoot实现了View和 WindowManager 之间的消息传递。在将主窗口添加到WindowManger时,它首先会建立一个代理对象:
wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE)
并且打开会话(IWindowSession),之后Window将通过该会话与 WindowManager 建立联系,
来看下setView方法:

java代码:
try {

res =sWindowSession.add(mWindow, mWindowAttributes,

getHostVisibility(), mAttachInfo.mContentInsets);

} catch (RemoteException e) {

mAdded = false;

mView = null;

mAttachInfo.mRootView =null;

unscheduleTraversals();

throw newRuntimeException("Adding window failed", e);

} finally {

if (restore) {

attrs.restore();

}

}

更多相关文章

  1. Android开发人员需要具备的知识(很全)!
  2. Android主流三方库源码分析(六、深入理解Leakcanary源码)
  3. Android中Bitmap类getPixel方法获取的像素值为负
  4. Android的View体系(三):View坐标以及方法说明
  5. Android(安卓)二维码开发功能实现(四)------基于Zxing实现编码功
  6. 阿里云手机应用开发点滴
  7. Android(安卓)组件硬知识点
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android菜鸟的成长笔记(17)—— 再看Androi
  2. 《Qt on Android核心编程》购买链接出来
  3. Android: 自定义Tab样式
  4. Android(安卓)最佳实践
  5. android 基本概念和一些术语
  6. 利用Handler来更新android的UI (2)
  7. Android开发环境搭建
  8. android 显示特殊符号
  9. Android多媒体开发高级编程
  10. Android(安卓)开发最佳实践