浅谈Android Dialog窗口机制

 更新时间:2022年04月12日 10:46:54   作者:酱油奶茶  
本文主要介绍了Android Dialog窗口机制,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

问题引出

//创建dialog 方式一
 AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
  // 创建dialog 方式二
 AlertDialog.Builderbuilder=new AlertDialog.Builder(getApplicationContex());

区别在构造时候于一个传当前activity 一个Application。第二种方式报错。那么区别在哪儿呢?

Dialog 与 Activity 共用一个 WindowManager 对象,所以Activity与Dialog共用同一个mAppToken值。所以在创建Dialog 时,如果传的Context是Application

Dialog源码分析

构造方法

构造方法中有三个比较重要的函数,可以自己去源码中查看

   // 步骤1. 获取WindowManager对象
   mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);

   // 步骤2. 为Dialog创建新的Window
   Window w = PolicyManager.makeNewWindow(mContext);
   mWindow = w;

   // 步骤3. 关联WindowManager与新Window
   // 注:第二个参数token为null,即一个Window属于Dialog的话,那么该Window的传入的mAppToken对象是null,Dialog没有自己的token
   w.setWindowManager(mWindowManager, null, null);
  • 步骤1:因为 context 是Activity,所以获取到的 WindowManager 属于 Activity,所以** Dialog 与 Activity 共用一个 WindowManager 对象**
  • 步骤2:获得 Activity 的WindowManager对象后,Dialog 又新建了一个 Window对象(PhoneWindow 类型,创建过程类似于 Activity 的 Window 创建过程)
  • 步骤3:将新创建 Dialog 的 window 关联到 Activity 的 WindowManager。特别注意的是:关于AppToken,只是Window的传入的mAppToken对象是null,但不代表Dialog的window无token,

所以得出结论

  • 结论1:Dialog 与 Activity 共用一个 WindowManager 对象
  • 结论2:Dialog 拥有自己的窗口 Window(PhoneWindow 类型)
  • 结论3:Dialog 的 Window 由附属的 Acitivty WindowManager 对象统一管理

show()方法

 // 1. 调用 Dialog的onCreate()
    dispatchOnCreate(null);

    // 2. 调用Dialog的onStart()
    onStart();

    // 3. 获取当前新Window的DecorView对象(类似于Activity)
    mDecor = mWindow.getDecorView();

    // 4. 获取新Window的WindowManager.LayoutParams参数
    WindowManager.LayoutParams l = mWindow.getAttributes();

    // 5. 把一个View添加到与Activity共用的windowManager里
    mWindowManager.addView(mDecor, l);
  • Dialog获取当前新Window的DecorView对象时过程类似于Activity,所以有一种自定义Dialog布局的方式就是重写Dialog的onCreate方法,使用setContentView传入布局,类似于 Activity。
  • 步骤4:由于Dialog 与 Activity 共用一个 WindowManager 对象,所以Activity与Dialog共用同一个mAppToken值(只是Dialog和Activity的Window对象不同)。
  • 步骤5:添加过程与Activity 窗口添加过程 保持一致。

到此这篇关于浅谈Android Dialog窗口机制的文章就介绍到这了,更多相关Android Dialog窗口机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android基于zxing的二维码(网格)扫描 仿支付宝网格扫描

    Android基于zxing的二维码(网格)扫描 仿支付宝网格扫描

    这篇文章主要为大家详细介绍了Android基于zxing的二维码网格扫描,仿支付宝网格扫描,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Android TV 焦点框移动的实现方法

    Android TV 焦点框移动的实现方法

    本篇文章主要介绍了Android TV 焦点框移动的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • android UI绘制加减号按钮

    android UI绘制加减号按钮

    这篇文章主要为大家详细介绍了android UI绘制加减号按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Android开发RecyclerView单独刷新使用技巧

    Android开发RecyclerView单独刷新使用技巧

    本篇文章主要是分享下RecyclerView中子item如何单独刷新以及子item的某一部分内容如何实现单独刷新,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Android实现ViewPager无限循环效果(一)

    Android实现ViewPager无限循环效果(一)

    这篇文章主要为大家详细介绍了Android实现ViewPager无限循环效果的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android跨进程传递大数据的方法实现

    Android跨进程传递大数据的方法实现

    这篇文章主要介绍了Android跨进程传递大数据的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 深入理解Android MD5数据加密

    深入理解Android MD5数据加密

    在Android中需要对各种数据进行加密的操作,比如用户短信备份的数据加密、用户账户登陆的密码加密以及应用于服务器连接传递重要数据的加密,用处非常的多,所以今天来总结一下MD5加密算法。
    2016-09-09
  • Android 调用系统相册选择照片

    Android 调用系统相册选择照片

    这篇文章主要介绍了Android 调用系统相册选择照片的方法,帮助大家更好的进行Android开发,感兴趣的朋友可以了解下
    2020-12-12
  • android自定义Camera实现录像和拍照

    android自定义Camera实现录像和拍照

    这篇文章主要为大家详细介绍了android自定义Camera实现录像和拍照功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • Android Flutter实现有趣的页面滚动效果

    Android Flutter实现有趣的页面滚动效果

    Flutter提供了 CustomScrollView 来粘合多个滑动组件,并且可以实现更有趣的滑动效果,本文就来为大家详细讲讲实现的方法,需要的可以参考一下
    2022-06-06

最新评论