android复杂的概念,经常会弄的人晕头转向.本篇说说ui里几个概念的关系.
1. 从activity启动流程,可以看出各个对象的关系
大家都知道,这是android ui的核心概念.收的就是界面的一个活动交互界面.用startAcvitity的方式启动.省去中间状态:
在activity的attach接口中:
5063 mWindow = PolicyManager.makeNewWindow(this); 每个activity有一个Window对象. 5064 mWindow.setCallback(this); 设置window对象的回调是activity 5087 mWindow.setWindowManager( 设置window对象的manager 5088 (WindowManager)context.getSystemService(Context.WINDOW_SERVICE), 5089 mToken, mComponent.flattenToString(), 5090 (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0); 5091 if (mParent != null) { 5092 mWindow.setContainer(mParent.getWindow()); 5093 } 5094 mWindowManager = mWindow.getWindowManager(); 保存windowmanager
2796 r.window = r.activity.getWindow(); 2797 View decor = r.window.getDecorView(); decorview是window子类, 通过window来获取 2798 decor.setVisibility(View.INVISIBLE); 2799 ViewManager wm = a.getWindowManager(); 2800 WindowManager.LayoutParams l = r.window.getAttributes(); 2801 a.mDecor = decor; 给activity的mDecor赋值 2804 if (a.mVisibleFromClient) { 2805 a.mWindowAdded = true; 2806 wm.addView(decor, l); 这个调用会调用到WindowManagerGlobal的addView 2807 }
16 root = new ViewRootImpl(view.getContext(), display); 6 root.setView(view, wparams, panelParentView);
也就是说, ViewRootImpl的mView其实是DecorView.
2. 总结
每个activity有个window,window被windowmanager管理.
每个window都有decorview.
每个window都有ViewRoot.
绘制发起从ViewRoot.
事件传递发起冲ViewRoot.
绘制传递canvas, canvas来自surface.