当前位置: 首页 > article >正文

Android --- Activity/Window/DecorView/ViewRootImpl的创建时机

自己看源码后的学习记录,仅供参考。

AndroidActivity/Window/DecorView/ViewRootImpl的创建时机

1.Activity 的创建时机
	-> public static void main(String[] args)
		-> ActivityThread.performLaunchActivity()//	Activity 被创建的时候会调用 performLaunchActivity 方法
				-> Activity activity = null;// 在 performLaunchActivity 方法内部,通过类加载器创建 Activity 实例
				   java.lang.ClassLoader cl = appContext.getClassLoader();
						activity = mInstrumentation.newActivity(
								 cl, component.getClassName(), r.intent);
3.Window 的创建时机
	-> ActivityThread.performLaunchActivity()
		-> Activity.attach() // performLaunchActivity 方法内部调用了 attach
			-> mWindow = new PhoneWindow(this, window, activityConfigCallback);  // Activity 中的成员变量 mWindow
				-> mDecor = (DecorView) preservedWindow.getDecorView(); 
4.DecorView 的创建时机
	onCreate 中调用 setContentView 方法
	AppcompatActivity.setContentView ->
	AppCompatDelegateImpl.setContentView ->
	AppCompatDelegateImpl.ensureSubDecor ->
	AppCompatDelegateImpl.createSubDecor ->
	Window.getDecorView -> 
		// Window 是个抽象类,如下:
		// public abstract class Window 
		// PhoneWindow 是 Window 的实现类,如下:
		// public class PhoneWindow extends Window implements MenuBuilder.Callback
		// Window.getDecorView()也就是 PhoneWindow.getDecorView()
	PhoneWindow.getDecorView ->
	// 下面是 PhoneWindow 中的 getDecorView 方法
	public class PhoneWindow extends Window implements MenuBuilder.Callback 
	 
	@Override
	public final @NonNull View getDecorView() {
		if (mDecor == null || mForceDecorInstall) {
			installDecor();
		}
		return mDecor;
	}
	// installDecor 方法中创建 DecorView 对象,并与 Window 绑定
	-> installDecor() 
		-> mDecor = generateDecor(-1);
			-> new DecorView(context, featureId, this, getAttributes());	
				-> mDecor.setWindow(this);
			   
5.绘制流程:
->ActivityThread.handleResumeActivity()
	->ViewManager.addView(decor, l); 
		// ViewManager是接口 ,如下:  
		// public interface ViewManager
		// public interface WindowManager extends ViewManager 
		// WindowManager 还是接口
		// public interface WindowManager extends ViewManager
		// WindowManagerImpl 是 WindowManager 的实现,所以:
 		->WindowManager ->WindowManagerImpl ->WindowManagerGlobal 的addView()

ViewRootImpl是在WindowManagerGlobal的addView方法中被初始化的
并且也是在这里与DecorView进行绑定,成为DecorView的parent
	-> addView()
		-> root = new ViewRootImpl(view.getContext(), display);
				view.setLayoutParams(wparams);

				mViews.add(view);
				mRoots.add(root);
				mParams.add(wparams);

				// do this last because it fires off messages to start doing things
				try {
				root.setView(view, wparams, panelParentView);ViewRootImpl的setView方法中,又会调用requestLayout,在这里就会进行这个View树的第一次测绘。
具体的方式是通过scheduleTraversals方法向Choreographer发送一个预定的消息,
并在下一次屏幕刷新的时候调用doTraversal → performTraversals方法进行ViewTree的测量、布局和绘制。
	-> setView()
		-> requestLayout()
			-> scheduleTraversals()
				-> mChoreographer.postCallback(
					Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
					-> doTraversal()
						-> performTraversals()
							-> performMeasure() / performLayout()/ performDraw()





ViewManagerWindowManagerWindowManagerImplWindowManagerGlobal之间的关系
	public interface ViewManager
	 {
		 public void addView(View view, ViewGroup.LayoutParams params);
		 public void updateViewLayout(View view, ViewGroup.LayoutParams params);
		 public void removeView(View view);
	 }

	 public interface WindowManager extends ViewManager{
		  ......
	 }

	 public final class WindowManagerImpl implements WindowManager {
		 private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
		 @override
		 public void addView(view,params){
			 mGlobal.addView(...);
		 }
		 public void updateViewLayout(view,params){
			 mGlobal.updateViewLayout(...);
		 }
		 public void remove(view){
			 mGlobal.remove(...);
		 }
	 }

	 public final class WindowManagerGlobal {
		 public void addView(...){
			 ......
		 }
		 public void updateViewLayout(...) {
			 ......
		 }
		 public void removeView(...) {
			 ......
		 }
	 }

http://www.kler.cn/a/154006.html

相关文章:

  • Springboot3.3.5 启动流程之 tomcat启动流程介绍
  • 5.4.2-1 编写Java程序在HDFS上创建文件
  • 十五届蓝桥杯赛题-c/c++ 大学b组
  • 基于 MONAI 的 3D 图像分割任务2(Brain Tumour 和 SwinUNETR 训练)
  • PgSQL汇总
  • 【视觉SLAM】2-三维空间刚体运动的数学表示
  • [论文精读]利用大语言模型对扩散模型进行自我修正
  • 2016年五一杯数学建模C题二孩政策问题解题全过程文档及程序
  • 深入理解Linux =~
  • Easy Excel设置表格样式
  • 【Element-ui】Icon 图标与Button 按钮
  • 【代码】基于改进差分进化算法的微电网调度研究matlab
  • 6.1810: Operating System Engineering <Lab2 syscall: System calls>
  • 【MySQL】视图 + 用户管理
  • 2023 如何下载最干净的 win10 win11 微软官方原版系统镜像(详细图文)
  • VBA数据库解决方案第七讲:如何利用Recordset对象打开数据库的数据记录集
  • 新手村之SQL——增删改查条件查询
  • 2024年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B卷
  • 【halcon】C# halcon 内存暴增
  • SQL优化的面试题
  • c# 责任链模式
  • 1076 Forwards on Weibo (链接表层序遍历)
  • Linux常用命令汇总
  • 【python】python列表的用法记录
  • 第15关 K8s HPA:自动水平伸缩Pod,实现弹性扩展和资源优化
  • 玄学调参实践篇 | 深度学习模型 + 预训练模型 + 大模型LLM