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);
```
将对话框设置为了系统级别,这样就不会弹出上面的错误提示.
本文介绍如何在Android的Service中实现对话框的显示。当基于Service而非Activity创建对话框时,通常会遇到无法添加窗口的问题。文章提供了一个解决方案,通过将对话框设置为系统级别,使其可以在没有Activity支持的情况下正常显示。
742

被折叠的 条评论
为什么被折叠?



