在制作一个置于所有应用前台悬浮Dialog是,我是通过service启动的自定义Dialog,但运行时报如下异常:
AndroidRuntime: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
AndroidRuntime: at android.view.ViewRootImpl.setView(ViewRootImpl.java:689)
AndroidRuntime: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:319)
AndroidRuntime: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
AndroidRuntime: at android.app.Dialog.show(Dialog.java:325)
原因是创建view时未使用正确的上下文Context。如果依托Activity启动,创建时传入此activity的上下文即可,但此时我是通过service直接前台启动的该怎么办呢?只需要在此Dialog初始化时(onCreate内)和AndroidManifest.xml内分别添加如下属性即可
//onCreate内添加
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
//manifest内添加
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
另外,如果是在activity中设置系统级权限,则也需要在Dialog初始化时添加属性,如下:
getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION);