美文网首页
Android Framework 之 Window / Win

Android Framework 之 Window / Win

作者: 行走中的3卡 | 来源:发表于2022-11-22 17:04 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Android Framework 之 Window / Win

          本文链接:https://www.haomeiwen.com/subject/lljnxdtx.html