Flutter如何实现应用关闭时仍在通知栏展示不可清除的常驻通知
Flutter 实现常驻不可清除通知栏通知方案
注意:该功能在不同操作系统上的实现限制差异较大,部分高版本系统可能有额外的权限管控要求
1 前置说明
- 只有Android平台支持「应用关闭后仍保留不可清除的常驻通知」的需求,iOS受系统沙盒机制限制,最多只能实现应用运行时的不可清除通知,应用退出后通知会被系统自动回收
- Android 8.0及以上版本中,常驻通知必须绑定前台服务实现,单独发送普通通知无法达成永久不被清除的效果
2 Android端实现步骤
2.1 引入依赖
推荐使用flutter_local_notifications插件完成能力封装,首先在pubspec.yaml中添加依赖:
dependencies: flutter_local_notifications: ^16.1.0 # 可选:用于申请通知权限 permission_handler: ^11.0.1
2.2 配置Android清单文件
在android/app/src/main/AndroidManifest.xml中添加对应权限和服务声明:
<!-- 前台服务基础权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Android 12+ 前台服务类型声明权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" /> <!-- Android 13+ 通知发送权限 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <application ...> <!-- 绑定常驻通知的前台服务配置 --> <service android:name="io.flutter.plugins.flutterlocalnotifications.ForegroundService" android:foregroundServiceType="specialUse" android:exported="false"/> </application>
2.3 核心实现代码
启动常驻通知的示例代码如下:
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:permission_handler/permission_handler.dart'; final FlutterLocalNotificationsPlugin notificationsPlugin = FlutterLocalNotificationsPlugin(); Future<void> startPersistentNotification() async { // 先申请通知权限 if (await Permission.notification.isDenied) { await Permission.notification.request(); } // 初始化通知配置 const AndroidInitializationSettings initAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); const InitializationSettings initSettings = InitializationSettings(android: initAndroid); await notificationsPlugin.initialize(initSettings); // 配置通知核心参数 const AndroidNotificationDetails androidConfig = AndroidNotificationDetails( 'persistent_channel_001', // 自定义通知渠道ID '常驻通知', // 通知渠道名称 channelDescription: '应用常驻运行提示', importance: Importance.low, priority: Priority.low, // 核心配置:标记为常驻不可清除 ongoing: true, autoCancel: false, showWhen: false, ); const NotificationDetails notificationConfig = NotificationDetails(android: androidConfig); // 启动前台服务绑定通知,固定通知ID为1即可 await notificationsPlugin.startForegroundService( 1, '应用后台运行中', '点击返回应用', notificationDetails: notificationConfig, ); } // 停止常驻通知调用的方法 Future<void> stopPersistentNotification() async { await notificationsPlugin.stopForegroundService(); await notificationsPlugin.cancel(1); }
- 核心参数
ongoing: true会标记通知为常驻状态,用户无法手动滑动清除 - 绑定前台服务后,通知会和服务生命周期绑定,即使应用被用户手动滑除后台,服务仍然会存活,通知也会持续展示
3 iOS端限制说明
iOS系统本身不支持完全不可清除的常驻通知,也不支持应用退出后保留通知,仅可配置应用运行时的通知不被自动清除,应用退出、系统重启、用户手动清理通知都会让通知消失。
内容的提问来源于stack exchange,提问作者user14485337
相关产品推荐
相关产品推荐

