我把最重要的核心本质区别写出来:
它们的相同点:它们都是弹窗
基本区别:popupwindow在显示之前一定要设置宽高,Dialog没有;popupwindow默认不会响应物理键盘的返回键,只有设置了popup.setfocusable(true)时才会响应,Dialog会响应物理键盘;popupwindow不会给页面其他部分添加蒙阪,dialog会。;popupwindow没有标题,dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题;二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。
核心区别:Dialog是非阻塞式对话框,AlertDialog弹出时后台还可以做其他事情,popupwindow是阻塞式对话框,popupwindow弹出时程序会等待,在popupwindow结束前程序会一直等待,当调用diamiss方法后popupwindow弹窗关闭程序才向下进行。
(这两种表现最直接的解释方式:AlertDialog弹出时背景是黑的,当我们点击背景时AlertDialog会消失,这证明了程序不仅响应会AlertDialog,还会响应其他操作,这证明AlertDialog是非阻塞式对话框;popupwindow弹出时背景没什么变化,当我们点击背景时程序没有响应,只允许我们操作popupwindow,其他操作被阻塞)