Dialog的生成,一般是基于Activity的这个对象,如代码:
private void showDialog(){
dialog = new AlertDialog.Builder(this);
dialog.setTitle("Test")
.setMessage("Test will show")
.create().show();
}
但是,有些情况很特殊。比如在Service中,需要弹出弹出对话框。此时,如果依然按照基于Activity对象的方式创建,那么在弹出对话框时,将会报:
```
AndroidRuntime: android.view.WindowManager$BadTokenException:
Unable to add window -- token null is not for an application
```
也就是说:对话框没有可以依附的Activity对象。所以不能基于Service对象来创建对话框。当然,可以使对话框基于全局。
private void shutdownDialog(){
if (sConfirmDialog != null){
sConfirmDialog.dismiss();
}
sConfirmDialog = new AlertDialog.Builder(this/*mContext*/)
.setTitle("Power off")
.setMessage("Your phone will shutdown")
.setPositiveButton("yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton("no", null)
.create();
//sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
sConfirmDialog.getWindow().setType(LayoutParams.TYPE_SYSTEM_ERROR);
sConfirmDialog.show();
}
即在 ==show()== 之前,加上
```
sConfirmDialog.getWindow().setType(LayoutParams.xxxxxxx);
```
将对话框设置为了系统级别,这样就不会弹出上面的错误提示.