目录
三.WindowManager.LayoutParams的TYPE类型:
一.使用悬浮窗功能的原因:
在Android开发中我们想要做到提醒用户关键信息的作用的时候.例如App更新信息之类的,有很多种方式去实现,主要的话还是三种方式Dialog,AlertDialog,PopupWindow,但是他们都有一个共同的缺点那就是依赖于Activity,而悬浮窗是不依赖Activity的,甚至,App在后台运行,悬浮窗依旧会弹出来,只要App进程不被杀死,但是悬浮窗也有缺点,那就是权限问题
二.悬浮窗的具体实现步骤:
一.添加权限:
<!-- 悬浮窗需要添加该权限-->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
二.动态申请权限:
private fun initFloatWindow() {
// 权限判断
if (!Settings.canDrawOverlays(applicationContext)) {
// 启动Activity让用户授权
val mIntent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:${packageName}"))
startActivityForResult(mIntent, 10)
} else {
// 已经有权限了,就去初始化对应的视图或者悬浮窗弹窗的初始化
initView()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == 10) {
if (Settings.canDrawOverlays(applicationContext)) {
initView()
} else {
ToastUtils.showToast(this, "请设置对应权限")
}
}
}
这段代码是用于在Activity中动态申请悬浮窗权限的,上面那个 ToastUtils是我自己封装的吐司类,这个很简单,相信大家都会,最终我们进入对应的Activity当中我们会跳转到这样一个界面来获取该应用的悬浮窗权限,像电视或者车载开发之类的对于权限已经做了静默处理了,总不能我们在使用车载导航的时候,弹出一个是否开启定位吧哈哈
三.WindowManager.LayoutParams的TYPE类型:
为什么要将这个TYPE类型放在第三位呢,因为这个就是导致各种问题出现的罪魁祸首
type = when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1 -> WindowManager.LayoutParams.TYPE_PHONE
else -> WindowManager.LayoutParams.TYPE_TOAST
}
上述这段代码是用来根据不同的Android版本设置窗口类型的,使用的Kotlin的when表达式,来判断设备的Android版本(Build.VERSION.SDK_INT),并根据版本返回不同的窗口类型(TYPE)
1. 如果 Android 版本大于或等于 Oreo&#x