Android Framework 之 Window / Win

2022-11-22  本文已影响0人  行走中的3卡

Dialog 创建 Window 的过程是在 构造函数里,
对比 Activity 的是在 attach 函数里. 对比一起分析,效果更佳.
Android Framework 之 Window / WindowManager (4) - Activity的 Window 创建过程 源码分析

1. 创建 Window

Dialog 构造函数

//Dialog.java
package android.app;

public class Dialog implements DialogInterface, Window.Callback... {
    Dialog(@UiContext @NonNull Context context, @StyleRes int themeResId,
            boolean createContextThemeWrapper) {
        ....

        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        final Window w = new PhoneWindow(mContext);
        mWindow = w;
        w.setCallback(this);
        ...
        w.setWindowManager(mWindowManager, null, null); 

可以看出,和 Activity 创建 Window 的逻辑类似,
通过 Context 获取 WindowManager 对象, 创建 PhoneWindow 对象,
设置回调, 设置 WindowManager 等.

2. 设置内容视图 setContentView

同样,使用 setContentView 设置 内容, 可以传入 布局id/view、参数等

    public void setContentView(@LayoutRes int layoutResID) {
        mWindow.setContentView(layoutResID);
    }
    
    public void setContentView(@NonNull View view) {
        mWindow.setContentView(view);
    }
    
    public void setContentView(@NonNull View view, @Nullable ViewGroup.LayoutParams params) {
        mWindow.setContentView(view, params);
    }

之后,还是通过 Window 的 setContentView 进行设置, 和 Activity的类似.

3. 将 DecorView 添加到 Window 中

这里和Activity 需要在 ActivityThread.handleResumeActivity 添加 不一样
Dialog 是通过 调用 show() 添加的.

    public void show() {
        if (mShowing) {
            if (mDecor != null) {
                ....
                mDecor.setVisibility(View.VISIBLE);
            }
            return;
        }
        ...
        mDecor = mWindow.getDecorView();
        ...
        mWindowManager.addView(mDecor, l);
        mShowing = true;
        sendShowMessage();
    }

分析
(1) 先判断是否正在显示,如果是 并且 mDecor 不为空,则直接设置visible
(2) 没有在显示,则调用 WindowManager.addView 执行添加 操作,此刻才会显示内容.

普通 Dialog 需要使用 Activity Context 创建.
系统 Dialog, 需要设置对应 WindowType

参考文献:
https://juejin.cn/post/7076274407416528909#heading-25

上一篇下一篇

猜你喜欢

热点阅读