当前位置: 移动技术网 > IT编程>移动开发>Android > Android Window的创建过程 - Activity的Window创建过程

Android Window的创建过程 - Activity的Window创建过程

2018年12月10日  | 移动技术网IT编程  | 我要评论

金典名作奶粉,湖南省通信局局长曾国华,普罗米修斯好看吗

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创建过程,可以发现过程是类似的。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网