欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-04-14 10:59:52
activity的window创建过程 在activitythread的performlaunchactivity方法中创建了activity,并调用了activity的attach方法 activ...

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