Activity ,Window ,WindowManager之间的关系

转载自:http://blog.csdn.net/android_jiangjun/article/details/45798221

Android源码(2.3.5)\frameworks\base\core\java\android\view

public interface ViewManager{
    public void addView(View view, ViewGroup.LayoutParams params);
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);
    public void removeView(View view);
}

//这里的WindowManager是一个接口,通过getSystemService
//通过这个方式可以获得许多的系统服务,比如电话,闹钟,电源管理
//WindowManager mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
public interface WindowManager extends ViewManager { 
	public static class LayoutParams extends ViewGroup.LayoutParams  implements Parcelable {

    }
}

public class WindowManagerImpl implements WindowManager {
	private View[] mViews; //表示View树的根节点
    private ViewRoot[] mRoots;  //ViewRoot 
    private WindowManager.LayoutParams[] mParams; //Window的属性

    它们分别用于表示View树的根节点、ViewRoot以及Window的属性。由此也可以看出,一个进程中不仅有一个ViewRoot;
    而Activity与ViewRoot则是一对一的关系。自Android4.3开始对此做了修改,WindowManagerImpl不再直接存储上述三个数组变量,
    而是由一个称为“WindowMangerGlobal”的类统一管理。

	public void addView(View view){}
	public void addView(View view, ViewGroup.LayoutParams params){}
	private void addView(View view, ViewGroup.LayoutParams params, boolean nest){}
	public void updateViewLayout(View view, ViewGroup.LayoutParams params);
	public void removeView(View view);
}

//这相当于“view”树的管理者,它有一个mView成员变量,指向的是它所管理的view树的根
//ViewRoot的核心任务就是与WindowManagerService进行通信
//这个ViewRoot存在于2.3.7以前,到4.0.1中就改了,4.0.1以后都是ViewRootImpl
//5、ViewRoot和WindowManagerService的关系 每一个ViewRootImpl内部,都有一个全局变量 static IWindowSession sWindowSession; 
//这个变量用于ViewRoot到WMS的连接,它是ViewRoot利用WMS的openSession()接口来创建得到的。在此基础上,
// ViewRoot也会通过IWindowSession.add()方法提供一个IWindow对象——从而让WMS也可以通过这个IBinder对象来与ViewRoot进行双向通信。 
//这里突然间冒出一个ViewRootImpl类,其实ViewRoot与ViewRootImpl的功能是一样的,只不过是Android不同版本的不同称呼。
public final class ViewRoot extends Handler implements ViewParent,View.AttachInfo.Callbacks {
	View mView;
}
public final class ViewRootImpl extends Handler implements ViewParent,
          View.AttachInfo.Callbacks, HardwareRenderer.HardwareDrawCallbacks {


}

public abstract class Window {
	mContext
	private WindowManager mWindowManager; //拿到的是WindowManagerImpl的实例
}
//以上的类都是在Android源码\frameworks\base\core\java\android\view

public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2 {

    private Window mWindow;
    private WindowManager mWindowManager;


    final void attach(....){
    	mWindow = PolicyManager.makeNewWindow(this);

    }
    public Object getSystemService(String name) {
        if (getBaseContext() == null) {
            throw new IllegalStateException(
                    "System services not available to Activities before onCreate()");
        }

        if (WINDOW_SERVICE.equals(name)) {
            return mWindowManager;
        } else if (SEARCH_SERVICE.equals(name)) {
            ensureSearchManager();
            return mSearchManager;
        }
        return super.getSystemService(name);
    }

}

其实每个Application都有一个ActivityThread主线程以及mActivities全局变量,后者记录了运行在应用程序中的所有Activity对象。
一个Activity对应唯一的WindowManager以及ViewRootImpl。WindowManagerGlobal作为全局管理者,
其内部的mRoots和mViews记录了Activity的ViewRootImpl和View树的顶层元素。ViewRootImpl的另一个重要角色就是负责与WMS通信。
从ViewRootImpl到WMS间的通信利用的是IWindowSession,而反方向则是由IWindow来完成的。
最后补充说明一点:Activity中有一个成员变量mWindow,mWindow里面有一个成员变量mWindowManager,
而mWindowManager是WindowMangerImpl类实例的引用,另外WindowMangerImpl里面包含ViewRoot(不管老版本中直接包含,还是新版本中间接包含)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值