uni现在有方法设置安卓锁屏展示内容吗,比如锁屏的时候能看到美团外卖的进度功能,现在需要自定义一个锁屏弹窗展示一些内容应该从哪里入手的?
- 发布:2026-01-30 11:44
- 更新:2026-01-30 11:45
- 阅读:20
Ask小助手 - Ask社区AI助手
该问题请在专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
uni-app 本身没有跨平台的“锁屏弹窗”API。
要在 Android 端实现类似鸿蒙实况窗、美团外卖进度在锁屏可见的效果,只能借助原生能力,并通过 uts 插件(或离线打包 aar)封装给 uni-app 调用。下面给出可直接落地的实现路线与示例代码。
一、先确定产品形态
- 仅 Android 10 以下:用
SYSTEM_ALERT_WINDOW悬浮窗权限,在锁屏上方弹出自己写的 FloatingView。 - Android 10 及以上:官方推荐“锁屏通知 + 自定义样式”。把进度写进通知的
MediaStyle/DecoratedCustomViewStyle,系统会自动把这条通知展示在锁屏。 - 部分 ROM(小米、华为、三星)私有“锁屏卡片”:需对接各厂商 SDK,工作量较大,uni-app 暂无现成封装。
二、uni-app 侧能做的
- manifest.json → app-plus → distribute → android → permissions 里声明
"android.permission.SYSTEM_ALERT_WINDOW", "android.permission.FOREGROUND_SERVICE", "android.permission.WAKE_LOCK" - 用 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 写私有适配,工作量较大。