金典名作奶粉,湖南省通信局局长曾国华,普罗米修斯好看吗
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创建过程,可以发现过程是类似的。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android studio 解决logcat无过滤工具栏的操作
Android Studio 恢复小窗口停靠模式(Docked Mode)
Android studio保存logcat日志到本地的操作
Android Studio快捷键生成TAG、Log.x日志输出介绍
网友评论