Android悬浮窗功能实现

目录

一.使用悬浮窗功能的原因:

二.悬浮窗的具体实现步骤:

一.添加权限:

二.动态申请权限:

 三.WindowManager.LayoutParams的TYPE类型:

四.编写代码:

1.XML代码:

2.Activity相关代码:

3.WindowManager相关代码 


一.使用悬浮窗功能的原因:

      在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值