3***@qq.com
3***@qq.com
  • 发布:2026-01-30 11:44
  • 更新:2026-01-30 11:45
  • 阅读:20

安卓锁屏类似鸿蒙实况窗

分类:uni-app

uni现在有方法设置安卓锁屏展示内容吗,比如锁屏的时候能看到美团外卖的进度功能,现在需要自定义一个锁屏弹窗展示一些内容应该从哪里入手的?

2026-01-30 11:44 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

该问题请在专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

uni-app 本身没有跨平台的“锁屏弹窗”API。
要在 Android 端实现类似鸿蒙实况窗、美团外卖进度在锁屏可见的效果,只能借助原生能力,并通过 uts 插件(或离线打包 aar)封装给 uni-app 调用。下面给出可直接落地的实现路线与示例代码。

一、先确定产品形态

  1. 仅 Android 10 以下:用 SYSTEM_ALERT_WINDOW 悬浮窗权限,在锁屏上方弹出自己写的 FloatingView。
  2. Android 10 及以上:官方推荐“锁屏通知 + 自定义样式”。把进度写进通知的 MediaStyle / DecoratedCustomViewStyle,系统会自动把这条通知展示在锁屏。
  3. 部分 ROM(小米、华为、三星)私有“锁屏卡片”:需对接各厂商 SDK,工作量较大,uni-app 暂无现成封装。

二、uni-app 侧能做的

  1. manifest.json → app-plus → distribute → android → permissions 里声明
    "android.permission.SYSTEM_ALERT_WINDOW",  
    "android.permission.FOREGROUND_SERVICE",  
    "android.permission.WAKE_LOCK"  
  2. 用 uts 插件新建原生模块(uni_modules/lockscreen)。
    • 创建 ForegroundService 保活
    • 在 Service 里用 WindowManager 添加 TYPE_APPLICATION_OVERLAY 的 View(Android 10+)或 TYPE_SYSTEM_ERROR(Android 8-9)
    • 判断锁屏:KeyguardManager#inKeyguardRestrictedInputMode() 为 true 时贴出 View,解锁后移除
    • 如果走“通知”方案,用 NotificationCompat.Builder 构造常驻通知,设置
      setVisibility(NotificationCompat.VISIBILITY_PUBLIC)  

      进度更新时重新发同 id 通知即可。

三、与前端通信
uts 插件暴露两个接口

showLockScreenView({title, progress})  
hideLockScreenView()

前端在订单状态变化时调用即可。
若希望点击锁屏卡片跳回 app,可在通知里设置 PendingIntent,通过 scheme 把参数带回 uni-app。

四、示例代码(uts 插件核心片段)
app-android/index.uts

import android.app.*  
import android.content.*  
import android.os.Build  
import android.view.*  
import android.widget.*  

const NOTIFICATION_ID = 0x1001  
const CHANNEL_ID = "lockscreen_channel"  

@UniMethod  
export function showLockScreenView(options: { title: string, progress: number }) {  
  const context = getApplicationContext()!!  
  val intent = Intent(context, MainActivity::class.java)  
  val pendingIntent = PendingIntent.getActivity(  
    context, 0, intent, PendingIntent.FLAG_IMMUTABLE  
  )  

  val builder = NotificationCompat.Builder(context, CHANNEL_ID)  
    .setSmallIcon(plus.android.importClass("com.example.app.R$drawable").icon)  
    .setContentTitle(options.title)  
    .setContentText(`进度 ${options.progress}%`)  
    .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)  
    .setOngoing(true)  
    .setContentIntent(pendingIntent)  

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {  
    val channel = NotificationChannel(  
      CHANNEL_ID, "锁屏通知", NotificationManager.IMPORTANCE_HIGH  
    )  
    val nm = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager  
    nm.createNotificationChannel(channel)  
  }  

  val nm = NotificationManagerCompat.from(context)  
  nm.notify(NOTIFICATION_ID, builder.build())  
}  

@UniMethod  
export function hideLockScreenView() {  
  val context = getApplicationContext()!!  
  NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)  
}

五、已有轮子
插件市场搜索“锁屏”、“悬浮窗”、“通知进度条”,目前没有完整开箱即用的“锁屏卡片”插件,只能参考示例自己改:

结论
uni-app 无法直接用 JS 在锁屏上画 UI,必须写原生插件。
最简单且兼容 Android 8-14 的方案是“常驻通知 + 自定义布局”,工作量最小;
若一定要鸿蒙实况窗那种全屏卡片,只能针对特定 ROM 写私有适配,工作量较大。

内容为 AI 生成,仅供参考

要回复问题请先登录注册