App端通知栏进度条需用plus.notification.createNotification配合progress字段实现,仅Android支持,须设ongoing:true、唯一id,并通过setOptions动态更新进度。

App端通知栏进度条怎么用 plus.notification.createNotification
uni-app 的 App 端(基于 5+ Runtime)不支持直接调用系统原生通知栏进度条 API,但可以通过 plus.notification.createNotification 配合自定义 options.progress 实现——前提是使用 HBuilderX 3.1.0+、运行基座为 2.6.0+,且仅限 Android(iOS 不支持进度条)。
关键点:必须传入 progress 字段,且通知需设置 ongoing: true(防止用户误触关闭),同时每次更新进度都要调用 notification.setOptions() 覆盖原通知。
-
progress是 0–100 的整数,不是小数或字符串 - 首次创建通知时必须指定
id,后续更新靠它匹配 - 不能用
uni.showToast或uni.showLoading替代——它们不进通知栏,也不支持进度 - Android 8.0+ 需提前申请
android.permission.POST_NOTIFICATIONS(HBuilderX 3.7.0+ 自动处理,旧版需手动加)
如何监听 uni.downloadFile 的真实下载进度
uni.downloadFile 本身不提供实时进度回调,但它的返回对象中包含 task 实例(仅 App 端有效),可通过 task.onProgressUpdate 拿到每帧下载数据。
注意:这个回调触发频率高(毫秒级),不要在里面做重操作(如频繁更新 UI 或通知),否则卡顿;建议节流 + 只在变化 ≥ 1% 时更新通知。
- 必须在
success回调之前绑定onProgressUpdate,否则错过初始进度 -
progress字段是已下载字节数,需自己计算百分比:Math.round((loaded / total) * 100) - total 可能为 0(服务端未返回
Content-Length),此时无法算准确进度,可改用「已下载 KB」文本代替百分比 - H5 和小程序端无
task,务必用uni.getSystemInfoSync().platform === 'app'做平台判断再启用
完整示例:带通知栏进度的文件下载
const downloadTask = uni.downloadFile({
url: 'https://example.com/large.zip',
success: (res) => {
if (res.statusCode === 200) {
uni.showToast({ title: '下载完成', icon: 'success' });
// 这里处理文件路径 res.tempFilePath
}
}
});
<p>// 仅 App 端生效
if (uni.getSystemInfoSync().platform === 'app') {
const notificationId = Date.now();
let lastPercent = 0;</p><p>downloadTask.task?.onProgressUpdate((e) => {
const percent = e.totalBytesExpectedToWrite > 0
? Math.round((e.loaded / e.totalBytesExpectedToWrite) * 100)
: Math.round(e.loaded / 1024); // fallback to KB</p><pre class="brush:php;toolbar:false;">// 节流:只在变化 ≥ 1% 或非零时更新
if (percent !== lastPercent && percent >= 0) {
lastPercent = percent;
const options = {
progress: percent,
ongoing: true,
title: '文件下载中',
message: `已下载 ${percent}${e.totalBytesExpectedToWrite > 0 ? '%' : 'KB'}`
};
if (percent === 100) {
options.message = '准备安装…';
options.ongoing = false;
}
// 创建或更新通知
const notification = plus.notification.createNotification(
notificationId,
options,
{ cover: true }
);
notification.setOptions(options);
}}); }
为什么进度条突然消失或卡在 99%
常见原因不是代码逻辑错,而是生命周期和资源释放问题:
- 页面卸载(
onUnload)后,onProgressUpdate仍可能触发,但plus.notification已不可用,导致报错或静默失败 - 没调用
notification.clear()或notification.close(),下次下载复用相同id时被系统拒绝更新 - Android 后台限制(尤其华为/小米)会冻结应用网络和通知更新,需引导用户关闭电池优化
-
e.totalBytesExpectedToWrite在重定向或分块传输时可能为 0,硬算percent会得NaN,必须兜底
最易忽略的是:通知 ID 冲突。多个下载任务共用一个 ID,后启动的任务会覆盖前者的进度更新——每个任务必须用唯一 ID,比如 Date.now() + Math.random()。











