一般启动Dialog都是传入Activity实例,是否可以通过传入Context启动Dialog?
如果我们注册Intent.ACTION_SCREEN_ON广播,然后从广播启动Dialog,会报错:
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
说明不能直接传入Context启动Dialog,此时我们需要做一些改装在onCreate方法中加入
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
} else {
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}
但是在8.0以上系统的手机上仍然显示不出Dialog,报错是:
Unable to add window android.view.ViewRootImpl$W@fadf9d4 -- permission denied for window type 2038
这时候需要去设置里面打开Display over other apps权限
if (!Settings.canDrawOverlays(MainActivity.this)){
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(intent)
}
同时要在Manifest.xml文件里面加入权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
否在跳转的Display over apps页面里面找不到你的APP。
这样就可以传Context启动自定义Dialog了
网友评论