问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android悬浮窗技术深度解析:WindowManager的实现原理与最佳实践

创作时间:
作者:
@小白创作中心

Android悬浮窗技术深度解析:WindowManager的实现原理与最佳实践

引用
CSDN
8
来源
1.
https://blog.csdn.net/m0_64561613/article/details/139056707
2.
https://blog.csdn.net/qq_45649553/article/details/138221071
3.
https://blog.csdn.net/liuning1985622/article/details/138447816
4.
https://blog.csdn.net/Billy_Zuo/article/details/135907024
5.
https://docs.pingcode.com/ask/ask-ask/164088.html
6.
https://cloud.tencent.com/developer/article/2449651
7.
https://help.aliyun.com/zh/apsara-video-sdk/developer-reference/how-to-achieve-picture-in-picture-playback
8.
https://open.oppomobile.com/new/developmentDoc/info?id=13047

Android悬浮窗技术通过WindowManager服务实现了在其他应用之上显示信息或提供操作界面的功能,极大地提升了用户体验。无论是信息提醒、快捷工具还是游戏辅助,悬浮窗都能发挥重要作用。然而,实现这一功能需要正确设置权限并在不同API级别下进行动态申请。此外,悬浮窗的生命周期管理也是关键,确保其在应用前后台切换时能正常工作。通过深入了解这些细节,开发者可以更好地利用悬浮窗技术,为用户提供高效便捷的应用体验。

01

悬浮窗技术概述

在Android系统中,悬浮窗是一种特殊的窗口类型,它能够浮在其他应用的界面上方,提供快捷操作或信息展示。这种功能在日常使用中非常常见,比如微信的悬浮聊天窗、音乐播放器的迷你播放器等。

实现悬浮窗功能的核心组件是WindowManager。WindowManager是Android系统的核心服务之一,负责管理所有窗口的显示和布局。通过WindowManager,开发者可以创建和管理悬浮窗,使其在其他应用之上显示。

02

悬浮窗的实现原理

要实现悬浮窗功能,需要完成以下几个关键步骤:

  1. 权限声明:首先需要在AndroidManifest.xml中声明悬浮窗权限:

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    
  2. 创建悬浮窗布局:定义悬浮窗的UI布局,可以是一个简单的ImageView,也可以是复杂的布局结构。

    <?xml version="1.0" encoding="utf-8"?>
    <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/iv_icon"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:scaleType="fitCenter"
        android:src="@drawable/fw_icon"/>
    
  3. 创建悬浮窗服务:通过Service来管理悬浮窗的生命周期。

    public class FloatingWindowService extends Service {
        private WindowManager windowManager;
        private View floatingView;
    
        @Override
        public void onCreate() {
            super.onCreate();
            windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
            floatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null);
    
            final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                    70,
                    70,
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
                            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
                            WindowManager.LayoutParams.TYPE_PHONE,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT
            );
            params.gravity = Gravity.TOP | Gravity.START;
            params.x = 0;
            params.y = 100;
            windowManager.addView(floatingView, params);
        }
    }
    
  4. 设置悬浮窗参数:使用WindowManager.LayoutParams来设置悬浮窗的位置、大小和类型。注意在Android 8.0(API 26)及以上版本中,需要使用TYPE_APPLICATION_OVERLAY类型。

03

权限申请与管理

从Android 6.0(API 23)开始,悬浮窗权限被归类为特殊权限,需要在运行时动态申请。开发者需要检查权限状态,并在未授权时引导用户前往系统设置页面授予权限。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                               Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, REQUEST_CODE);
}
04

兼容性处理

不同版本的Android系统对悬浮窗的支持有所不同。在Android 8.0(API 26)及以上版本中,需要使用TYPE_APPLICATION_OVERLAY类型;而在更低版本中,则使用TYPE_PHONE类型。因此,在设置悬浮窗类型时需要进行版本判断:

int type = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
            WindowManager.LayoutParams.TYPE_PHONE;
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        width,
        height,
        type,
        flags,
        format
);
05

生命周期管理

悬浮窗的显示和隐藏需要与应用的生命周期同步。通常使用Service来管理悬浮窗的生命周期,确保在应用进入后台或被销毁时能够正确处理悬浮窗的状态。

@Override
public void onDestroy() {
    super.onDestroy();
    if (floatingView != null) {
        windowManager.removeView(floatingView);
    }
}

通过以上步骤,开发者可以实现一个基本的悬浮窗功能。然而,在实际开发中还需要考虑更多细节,比如悬浮窗的拖动、点击事件处理、透明度调整等,以提供更好的用户体验。

悬浮窗技术在Android开发中具有广泛的应用场景,从简单的信息提示到复杂的快捷操作界面,都能发挥重要作用。通过深入理解WindowManager的工作原理和悬浮窗的实现细节,开发者可以更好地利用这一功能,为用户带来更加便捷和丰富的使用体验。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号