本文主要是介绍Activity ,Window ,WindowManager之间的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转载自:http://blog.csdn.net/android_jiangjun/article/details/45798221
Android源码(2.3.5)\frameworks\base\core\java\android\viewpublic 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 {mContextprivate WindowManager mWindowManager; //拿到的是WindowManagerImpl的实例
}
//以上的类都是在Android源码\frameworks\base\core\java\android\viewpublic class Activity extends ContextThemeWrapperimplements 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(不管老版本中直接包含,还是新版本中间接包含)。
这篇关于Activity ,Window ,WindowManager之间的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!