Android Window的创建过程 - Activity的Window创建过程
activity的window创建过程
在activitythread的performlaunchactivity方法中创建了activity,并调用了activity的attach方法
activity
attach
在attach方法中,创建了window的对象,并设置了window的回调。由此可以看出,activity中持有的mwindow对象即为phonewindow。
创建phonewindow
mwindow = new phonewindow(this, window, activityconfigcallback); mwindow.setwindowcontrollercallback(this); mwindow.setcallback(this); mwindow.setonwindowdismissedcallback(this); mwindow.getlayoutinflater().setprivatefactory(this);
从这段代码中可以看出window已经创建完成了。下面接着看activity的视图是怎么显示在window上的。
由于activity的界面显示是由setcontentview发起的,所以从setcontentview着手分析。
setcontentview
public void setcontentview(@layoutres int layoutresid) { getwindow().setcontentview(layoutresid); initwindowdecoractionbar(); }
由上面的这段代码可以得出,activity的setcontentview方法调用了phonewindow的setcontentview方法。
phonewindow
setcontentview
1 创建decorview对象
在setcontentview方法中,首先通过installdecor方法创建decorview
mdecor = generatedecor(-1);
简单介绍一下decorview,decorview是一个framelayout。是activity中的*的view。此布局会包含一个标题栏和一个内容栏。但是根据设置主题的不同,有可能标题栏会没有。但是内容栏是肯定有的。内容栏对应的id为content。所以当在activity中调用方法r.layout.activity_main。其值就是赋给decorview中id为content的内容栏。
2 加载具体布局文件到decorview
在generatedecor方法中,通过下面这行代码,将布局资源赋给decorview
mdecor.onresourcesloaded(mlayoutinflater, layoutresource);
在decorview中的onresourcesloaded方法可以看出,直接将布局资源赋值给了mcontentroot。
final view root = inflater.inflate(layoutresource, null); mcontentroot = (viewgroup) root;
到此为止,activity的布局文件已经添加到了decorview中。
经过上述步骤,可以得出,此时虽然window对象已经创建,decorview也已经创建,但是decorview还并没有添加到window中。
activitythread
handleresumeactivity
在handleresumeactivity方法中首先会调用onresume方法。
然后会调用activity的makevisible方法
if (r.activity.mvisiblefromclient) { r.activity.makevisible(); }
activity
makevisible
void makevisible() { if (!mwindowadded) { viewmanager wm = getwindowmanager(); wm.addview(mdecor, getwindow().getattributes()); mwindowadded = true; } mdecor.setvisibility(view.visible); }
从这段代码中可以看出,首先获取windowmanager对象,然后通过此windowmanager将decorview添加到window中。至此activity中的window的创建过程已经分析完了。
dialog的window创建过程
dialog的window创建过程和activity类似。有如下几个步骤
1 创建window
在dialog的构造方法中,创建了window对象,并设置回调
final window w = new phonewindow(mcontext); mwindow = w; w.setcallback(this); w.setonwindowdismissedcallback(this); w.setonwindowswipedismissedcallback(() -> { if (mcancelable) { cancel(); } });
2 初始化decorview并将dialog的视图添加到decorview中
在show方法中,给decorview赋值
mdecor = mwindow.getdecorview();
将布局id添加到decorview中
public void setcontentview(@layoutres int layoutresid) { mwindow.setcontentview(layoutresid); }
3 将decorview添加到window中
mwindowmanager.addview(mdecor, l); mshowing = true;
对比之前的activity的window创建过程,可以发现过程是类似的。
上一篇: [.net]从比较两个字节数组谈起
下一篇: Oracle创建聚簇表
推荐阅读