Android 8.0系统上使用WindowManager添加view的一个问题
2017-12-20 15:06
387 查看
如图,app有个功能,用户设置一个定时,到时后会弹窗提示。实现很简单,注册SYSTEM_ALERT_WINDOW权限,使用WindowManager对象调用addView(view, para)添加view即可。
WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); para.type = WindowManager.LayoutParams.TYPE_PHONE; ... (6.0以上需要动态检查是否被授予了SYSTEM_ALERT_WINDOW权限) ... wm.addView(view, para);
之前一直好使,最近把测试机升级到8.0,却发现直接崩溃了:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
但是这时候我的app确实是在前台运行的,经过一番搜索之后发现,在8.0上,对于TYPE_PHONE等几种种窗口类型,使用SYSTEM_ALERT_WINDOW权限不能在其他应用和系统窗口上方显示提醒窗口,而需要使用名为 TYPE_APPLICATION_OVERLAY 的新窗口类型。
官方文档具体如下:
使用 SYSTEM_ALERT_WINDOW 权限的应用无法再使用以下窗口类型来在其他应用和系统窗口上方显示提醒窗口: TYPE_PHONE TYPE_PRIORITY_PHONE TYPE_SYSTEM_ALERT TYPE_SYSTEM_OVERLAY TYPE_SYSTEM_ERROR 相反,应用必须使用名为 TYPE_APPLICATION_OVERLAY 的新窗口类型。 使用 TYPE_APPLICATION_OVERLAY 窗口类型显示应用的提醒窗口时,请记住新窗口类型的以下特性: 应用的提醒窗口始终显示在状态栏和输入法等关键系统窗口的下面。 系统可以移动使用 TYPE_APPLICATION_OVERLAY 窗口类型的窗口或调整其大小,以改善屏幕显示效果。 通过打开通知栏,用户可以访问设置来阻止应用显示使用 TYPE_APPLICATION_OVERLAY 窗口类型显示的提醒窗口。
所以在设置type的时候增加判断即可:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { para.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { para.type = WindowManager.LayoutParams.TYPE_PHONE; }
相关文章推荐
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0系统上使用WindowManager添加view的一个问题
- android中通过添加view使用ViewPager出现的问题及解决方法
- android 使用windowManager添加两个view的时候,如何控制view的层级关系
- 【Android】webView 使用 系统自带搜索对话框问题
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类