//创建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
构造方法中有三个比较重要的函数,可以自己去源码中查看
// 步骤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. 调用 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);