Android 11 Activity 悬浮窗
引言
在 Android 11 中,Google 引入了一项新功能,即允许应用程序在后台显示悬浮窗。这为开发者提供了更多的灵活性,使他们能够开发更多有趣和实用的应用。本文将向您介绍如何在 Android 11 中实现 Activity 悬浮窗,并提供代码示例。
什么是悬浮窗?
悬浮窗指的是一个浮动在屏幕上方的小窗口,它可以显示在其他应用程序的顶部。用户可以通过悬浮窗与应用程序进行交互,而无需切换到应用程序的全屏界面。
Android 11 中的悬浮窗
在 Android 11 中,Google 引入了一项名为 "悬浮窗权限" 的新特性。要在 Android 11 中显示悬浮窗,您需要先获取悬浮窗权限。以下是在 Android 11 中实现 Activity 悬浮窗的步骤。
- 在 AndroidManifest.xml 文件中声明权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
- 请求悬浮窗权限:
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()
方法中处理结果。
- 在 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 {
// 未获取悬浮窗权限
}
}
}
在上述代码中,我们检查用户是否授予了悬浮窗权限。如果是,我们可以开始显示悬浮窗;如果不是,我们可以根据需要采取适当的措施。
- 显示悬浮窗:
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 中。
- 关闭悬浮窗:
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: 移除悬浮