uniapp app最小化后如何显示悬浮窗

在uniapp开发的APP中,当应用最小化到后台运行时,如何实现显示一个悬浮窗?需要兼容Android和iOS平台,最好能提供具体的代码示例或实现思路。另外,悬浮窗是否需要特殊权限,在不同系统版本上有什么注意事项?

2 回复

在uniapp中,可通过plus.webview.create创建悬浮窗,设置popover属性,并调用show方法显示。需注意在manifest.json中配置权限。


在 UniApp 中,当应用最小化(进入后台)时,显示悬浮窗通常需要依赖原生能力实现,因为 H5 环境无法直接控制窗口行为。以下是实现步骤和示例代码:

实现思路

  1. 使用 UniApp 的 Native.js:通过调用原生 Android/iOS API 创建悬浮窗。
  2. 监听应用状态变化:使用 onHideonShow 生命周期,在应用进入后台时触发悬浮窗显示。
  3. 注意权限问题:Android 需要 SYSTEM_ALERT_WINDOW 权限,iOS 限制较多,通常需企业证书或越狱。

示例代码(Android 方向)

  1. App.vue 中监听生命周期
    export default {
      onHide() {
        // 应用进入后台时调用原生方法显示悬浮窗
        if (uni.getSystemInfoSync().platform === 'android') {
          this.showFloatingWindow();
        }
      },
      onShow() {
        // 应用回到前台时隐藏悬浮窗
        if (uni.getSystemInfoSync().platform === 'android') {
          this.hideFloatingWindow();
        }
      },
      methods: {
        showFloatingWindow() {
          // 通过 Native.js 调用 Android API
          const main = plus.android.runtimeMainActivity();
          const WindowManager = plus.android.importClass('android.view.WindowManager');
          const LayoutParams = plus.android.importClass('android.view.WindowManager.LayoutParams');
          
          // 创建布局参数(示例参数,需调整)
          const params = new LayoutParams(
            200, 400,
            LayoutParams.TYPE_APPLICATION_OVERLAY, // 类型需根据系统版本调整
            LayoutParams.FLAG_NOT_FOCUSABLE,
            plus.android.importClass('android.graphics.PixelFormat').TRANSLUCENT
          );
          
          // 创建悬浮窗视图(这里以 TextView 为例)
          const TextView = plus.android.importClass('android.widget.TextView');
          const textView = new TextView(main);
          textView.setText("悬浮窗内容");
          
          // 添加到窗口
          const wm = main.getSystemService(plus.android.importClass('android.content.Context').WINDOW_SERVICE);
          wm.addView(textView, params);
          this.floatingView = textView; // 保存引用
        },
        
        hideFloatingWindow() {
          if (this.floatingView) {
            const wm = plus.android.runtimeMainActivity().getSystemService(
              plus.android.importClass('android.content.Context').WINDOW_SERVICE
            );
            wm.removeView(this.floatingView);
            this.floatingView = null;
          }
        }
      }
    }
    

注意事项

  • 权限配置:在 AndroidManifest.xml 中添加权限:
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    
  • 兼容性:Android 8.0+ 需使用 TYPE_APPLICATION_OVERLAY,低版本用 TYPE_SYSTEM_ALERT
  • iOS 限制:iOS 无法直接实现全局悬浮窗,可通过 UIWindow 尝试但受沙盒限制,通常仅限企业应用。
  • 用户体验:需用户手动开启“悬浮窗权限”,否则可能无法显示。

替代方案

若原生开发复杂,可考虑使用 UniApp 插件市场中的悬浮窗插件(如「悬浮窗」插件),简化集成流程。

建议在实际开发中详细测试不同设备和系统版本,确保功能稳定。

回到顶部