Android 11 Activity 悬浮窗

引言

在 Android 11 中,Google 引入了一项新功能,即允许应用程序在后台显示悬浮窗。这为开发者提供了更多的灵活性,使他们能够开发更多有趣和实用的应用。本文将向您介绍如何在 Android 11 中实现 Activity 悬浮窗,并提供代码示例。

什么是悬浮窗?

悬浮窗指的是一个浮动在屏幕上方的小窗口,它可以显示在其他应用程序的顶部。用户可以通过悬浮窗与应用程序进行交互,而无需切换到应用程序的全屏界面。

Android 11 中的悬浮窗

在 Android 11 中,Google 引入了一项名为 "悬浮窗权限" 的新特性。要在 Android 11 中显示悬浮窗,您需要先获取悬浮窗权限。以下是在 Android 11 中实现 Activity 悬浮窗的步骤。

  1. 在 AndroidManifest.xml 文件中声明权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
  1. 请求悬浮窗权限:
val hasPermission = Settings.canDrawOverlays(this)
if (!hasPermission) {
    val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
    intent.data = Uri.parse("package:" + packageName)
    startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION)
} else {
    // 已获取悬浮窗权限
}

在上述代码中,我们首先检查是否已经获得了悬浮窗权限。如果没有,我们将启动一个设置界面来请求权限。请注意,您需要使用 startActivityForResult() 方法来启动设置界面,并在 onActivityResult() 方法中处理结果。

  1. 在 onActivityResult() 方法中处理权限请求结果:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_OVERLAY_PERMISSION) {
        val hasPermission = Settings.canDrawOverlays(this)
        if (hasPermission) {
            // 已获取悬浮窗权限
        } else {
            // 未获取悬浮窗权限
        }
    }
}

在上述代码中,我们检查用户是否授予了悬浮窗权限。如果是,我们可以开始显示悬浮窗;如果不是,我们可以根据需要采取适当的措施。

  1. 显示悬浮窗:
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager
val layoutParams = WindowManager.LayoutParams(
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    PixelFormat.TRANSLUCENT
)
layoutParams.gravity = Gravity.TOP or Gravity.LEFT
layoutParams.x = 100
layoutParams.y = 100

val view = LayoutInflater.from(this).inflate(R.layout.floating_view, null)
windowManager.addView(view, layoutParams)

在上述代码中,我们首先获取 WindowManager 对象,并创建一个 WindowManager.LayoutParams 对象。我们可以设置布局参数的宽度、高度、类型、标志、透明度等属性。然后,我们通过 LayoutInflater.from() 方法加载悬浮窗的布局文件,最后通过 addView() 方法将布局添加到 WindowManager 中。

  1. 关闭悬浮窗:
windowManager.removeView(view)

在上述代码中,我们通过 removeView() 方法从 WindowManager 中移除悬浮窗。

序列图

下面是一个表示在 Android 11 中实现 Activity 悬浮窗的序列图。您可以使用 mermaid 语法将其表示出来。

sequenceDiagram
    participant User
    participant App
    participant Android System

    User->>App: 打开应用
    App->>Android System: 请求悬浮窗权限
    Android System-->>App: 弹出权限请求对话框
    User->>Android System: 授予悬浮窗权限
    Android System->>App: 返回权限请求结果
    App->>Android System: 显示悬浮窗
    User->>App: 与悬浮窗交互
    User->>App: 关闭应用
    App->>Android System: 移除悬浮