有时我们为android系统SystemUI部分添加功能的时候,需要弹出一个Dialog来通知用户,但是SystenUI中的大部分类虽然提供了Context,但是却没有绑定相应的Activity。虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApplicationContext()获得的Context,而必须使用Activity.一般的Toast可以正常创建,但是如果需要创建AlertDialog的话在最后AlertDialog.show()会报出 Unable to add window – token null is not for an application 这个错误,这个错误正式因为作为构造参数传进去的context没有绑定相应的Activity。
但是,我们的google大大非常友好的给我们提供了这个工具类 com.android.systemui.statusbar.phone.SystemUIDialog;
你可以在SystemUI/ 的任意地方(在我目前使用到所有SystemUI的子包下面都没有问题)new一个这个类的实例来进行AlertDialog的弹出。
让我们看看SystemUIDialog是如何解决这个问题的,首先SystemUIDialog继承了AlertDialog 然后在它的构造方法中首先调用AlertDialog的构造方法,
public SystemUIDialog(Context context){
super(context,R.style.Theme_SystemUI_Dialog);
mContext = context;
getWindow()
.setType(WindowManager
.LayoutParams.TYPE_STATUS_BAR_PANEL);
getWindow()
.addFlags(WindowManager
.LayoutParams.FLAG_ALT_FOCUSABLE_IM
| WindowManager
.LayoutParams
.FLAG_SHOW_WHEN_LOCKED);
WindowManager
.LayoutParams attrs = getWindow().getAttributes();
attrs.setTitle(getClass().getSimpleName());
getWindow().setAttributes(attrs);
}
之后用getWindow 获取当前的Window并且设定它的Type 并且添加了一些flag,之后将SystemUIDialog类名加入Window的attrs中.其实并不清楚具体为什么要这么做只是这么做确实可以将AlertDialog的绑定问题搞定