Dialog 的构造方法的 context 必须传入 Activity吗?

833 阅读1分钟

为什么使用非Activity来创建并弹出Dialog,有时会发生BadTokenException?

主要是因为非Activity的Context它的WindowManger没有ParentWindow,导致在WMS那边找不到对应的容器,也就是不知道要把Dialog的Window放置在何处。

查找容器还跟Context实例有关系吗? 使用Service或Application就找不到容器,换成Activity就能找到,这是为什么?

Dialog在show方法里是通过WindowManager来添加View的,而这个WindowManager对象就是从Context的getSystemService(WINDOW_SERVICE)方法获得的。

重点来了:因为Activity重写了Context的getSystemService方法,在获取的WINDOW_SERVICE的时候返回了Activity主Window的WindowManager对象。当然了,这个主Window的WindowManager对象也没有什么特别之处,只是它里面的mParentWindow指向的是主Window(其他非Activity的Context的WindowManager.mParentWindow默认都是null)。

参考:

每日一问 | Dialog 的构造方法的 context 必须传入 Activity吗?