本地通知 - Flutter在鸿蒙平台推送消息通知

发布时间:2026/7/22 21:54:04

本地通知 - Flutter在鸿蒙平台推送消息通知 概述在移动应用开发中通知是与用户保持沟通的重要方式。本地通知允许应用在设备上显示消息即使用户当前没有打开应用。Flutter提供了flutter_local_notifications库来实现跨平台的本地通知功能。本文将详细介绍本地通知的核心概念、使用方法、高级特性以及在鸿蒙平台上的实现细节。核心概念什么是本地通知本地通知是由应用本地触发的通知不需要服务器推送。它具有以下特点离线可用不需要网络连接即时触发可以立即显示或定时显示用户交互支持点击跳转到应用自定义样式可以自定义标题、内容、图标等通知的类型类型描述应用场景即时通知立即显示消息提醒、操作反馈定时通知在指定时间显示闹钟、日程提醒周期通知按固定间隔重复显示每日提醒、周报推送通知通道AndroidAndroid 8.0API 26引入了通知通道概念每个通知必须属于一个通道重要性级别决定通知的优先级和显示方式声音设置自定义通知声音震动模式自定义震动模式免打扰策略控制通知在免打扰模式下的行为基本使用安装依赖dependencies:flutter_local_notifications:^17.0.0初始化通知服务importpackage:flutter_local_notifications/flutter_local_notifications.dart;finalFlutterLocalNotificationsPlugin_notificationsPluginFlutterLocalNotificationsPlugin();FuturevoidinitNotifications()async{constAndroidInitializationSettingsinitializationSettingsAndroidAndroidInitializationSettings(mipmap/ic_launcher);constInitializationSettingsinitializationSettingsInitializationSettings(android:initializationSettingsAndroid);await_notificationsPlugin.initialize(initializationSettings);}显示简单通知FuturevoidshowNotification()async{constAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(default_channel,默认通知,channelDescription:应用默认通知通道,importance:Importance.max,priority:Priority.high,);constNotificationDetailsnotificationDetailsNotificationDetails(android:androidDetails);await_notificationsPlugin.show(0,通知标题,通知内容,notificationDetails,);}核心代码示例代码示例1通知服务封装importpackage:flutter_local_notifications/flutter_local_notifications.dart;classNotificationService{staticfinalFlutterLocalNotificationsPlugin_notificationsPluginFlutterLocalNotificationsPlugin();staticFuturevoidinit()async{constAndroidInitializationSettingsinitializationSettingsAndroidAndroidInitializationSettings(mipmap/ic_launcher);constInitializationSettingsinitializationSettingsInitializationSettings(android:initializationSettingsAndroid);await_notificationsPlugin.initialize(initializationSettings);}staticFuturevoidshowNotification({required int id,requiredStringtitle,requiredStringbody,String?payload,})async{constAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(default_channel,默认通知,channelDescription:应用默认通知通道,importance:Importance.max,priority:Priority.high,ticker:ticker,);constNotificationDetailsnotificationDetailsNotificationDetails(android:androidDetails);await_notificationsPlugin.show(id,title,body,notificationDetails,payload:payload);}staticFuturevoidscheduleNotification({required int id,requiredStringtitle,requiredStringbody,requiredDateTimescheduledTime,String?payload,})async{constAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(scheduled_channel,定时通知,channelDescription:定时任务通知通道,);constNotificationDetailsnotificationDetailsNotificationDetails(android:androidDetails);await_notificationsPlugin.schedule(id,title,body,scheduledTime,notificationDetails,payload:payload,);}staticFuturevoidcancelNotification(int id)async{await_notificationsPlugin.cancel(id);}staticFuturevoidcancelAllNotifications()async{await_notificationsPlugin.cancelAll();}}代码说明单例模式使用静态实例避免重复创建初始化配置配置Android初始化设置即时通知提供showNotification方法显示即时通知定时通知提供scheduleNotification方法安排定时通知取消通知支持取消单个或全部通知代码示例2周期通知classPeriodicNotificationService{staticFuturevoidshowPeriodicNotification({required int id,requiredStringtitle,requiredStringbody,RepeatIntervalrepeatIntervalRepeatInterval.hourly,String?payload,})async{constAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(periodic_channel,周期通知,channelDescription:周期性通知通道,importance:Importance.defaultImportance,);constNotificationDetailsnotificationDetailsNotificationDetails(android:androidDetails);await_notificationsPlugin.periodicallyShow(id,title,body,repeatInterval,notificationDetails,payload:payload,);}staticFuturevoidshowDailyReminder({required int id,requiredStringtitle,requiredStringbody,Timetime,String?payload,})async{constAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(daily_channel,每日提醒,channelDescription:每日定时提醒通道,);constNotificationDetailsnotificationDetailsNotificationDetails(android:androidDetails);await_notificationsPlugin.showDailyAtTime(id,title,body,time,notificationDetails,payload:payload,);}}代码说明周期通知支持按小时、每日、每周等间隔重复每日提醒在指定时间每天显示通知灵活配置支持自定义重复间隔代码示例3自定义通知样式classCustomNotificationService{staticFuturevoidshowBigPictureNotification({required int id,requiredStringtitle,requiredStringbody,requiredStringimageUrl,})async{finalBigPictureStyleInformationbigPictureStyleBigPictureStyleInformation(FilePathAndroidBitmap(imageUrl),largeIcon:FilePathAndroidBitmap(imageUrl),contentTitle:title,summaryText:body,);finalAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(big_picture_channel,大图通知,channelDescription:显示大图的通知通道,styleInformation:bigPictureStyle,);finalNotificationDetailsnotificationDetailsNotificationDetails(android:androidDetails);await_notificationsPlugin.show(id,title,body,notificationDetails);}staticFuturevoidshowInboxNotification({required int id,requiredStringtitle,requiredListStringmessages,})async{finalInboxStyleInformationinboxStyleInboxStyleInformation(messages,contentTitle:title,summaryText:${messages.length}条新消息,);finalAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(inbox_channel,收件箱通知,channelDescription:显示多条消息的通知通道,styleInformation:inboxStyle,);finalNotificationDetailsnotificationDetailsNotificationDetails(android:androidDetails);await_notificationsPlugin.show(id,title,,notificationDetails);}staticFuturevoidshowProgressNotification({required int id,requiredStringtitle,int maxProgress100,int currentProgress0,})async{finalAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(progress_channel,进度通知,channelDescription:显示进度的通知通道,showProgress:true,maxProgress:maxProgress,progress:currentProgress,);finalNotificationDetailsnotificationDetailsNotificationDetails(android:androidDetails);await_notificationsPlugin.show(id,title,,notificationDetails);}}代码说明大图通知显示图片的通知样式收件箱通知显示多条消息列表进度通知显示下载或上传进度代码示例4通知点击处理classNotificationHandler{staticFuturevoidinit()async{constAndroidInitializationSettingsinitializationSettingsAndroidAndroidInitializationSettings(mipmap/ic_launcher);constInitializationSettingsinitializationSettingsInitializationSettings(android:initializationSettingsAndroid);await_notificationsPlugin.initialize(initializationSettings,onDidReceiveNotificationResponse:(response){_handleNotificationTap(response);},);}staticvoid_handleNotificationTap(NotificationResponseresponse){finalpayloadresponse.payload;if(payload!null){_navigateToPage(payload);}}staticvoid_navigateToPage(Stringpayload){switch(payload){casehome:break;caseprofile:break;casesettings:break;default:break;}}staticFuturevoidcheckPendingNotifications()async{finalpendingNotificationsawait_notificationsPlugin.pendingNotificationRequests();for(finalnotificationinpendingNotifications){print(Pending notification:${notification.title});}}}代码说明点击回调处理通知点击事件Payload传递通过payload传递页面路由信息页面导航根据payload跳转到对应页面待处理通知查询已安排但未显示的通知高级特性1. 通知群组FuturevoidcreateNotificationGroup()async{await_notificationsPlugin.createNotificationChannelGroup(constNotificationChannelGroup(my_group,我的群组,),);}2. 自定义声音finalAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(custom_sound_channel,自定义声音,sound:RawResourceAndroidNotificationSound(custom_sound),);3. 震动模式finalAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(vibration_channel,震动通知,vibrationPattern:Int64List.fromList([0,100,500,100]),);4. 通知优先级finalAndroidNotificationDetailsandroidDetailsAndroidNotificationDetails(priority_channel,高优先级通知,importance:Importance.max,priority:Priority.high,fullScreenIntent:true,);在鸿蒙平台的实现鸿蒙平台适配鸿蒙平台对Flutter本地通知的支持与Android类似因为鸿蒙兼容Android应用。需要注意以下几点通知权限需要在鸿蒙平台申请通知权限图标资源使用合适的图标尺寸通知通道遵循鸿蒙的通知通道机制鸿蒙平台权限配置在module.json5中配置通知权限{module:{requestPermissions:[{name:ohos.permission.NOTIFICATION}]}}鸿蒙平台注意事项通知样式鸿蒙平台支持Android的通知样式后台限制鸿蒙平台对后台通知有一定限制省电模式省电模式下通知可能延迟性能对比操作即时通知定时通知周期通知触发延迟立即精确到秒按间隔触发资源消耗低中中可靠性高高中最佳实践1. 合理使用通知避免滥用通知只在重要事件时发送if(isImportantEvent){awaitNotificationService.showNotification(id:1,title:重要通知,body:您有一条重要消息,);}2. 统一管理通知ID使用常量管理通知IDclassNotificationIds{staticconstint message1;staticconstint reminder2;staticconstint update3;}3. 清理过期通知及时取消不再需要的通知awaitNotificationService.cancelNotification(NotificationIds.reminder);4. 处理点击事件确保通知点击能正确导航onDidReceiveNotificationResponse:(response){if(response.payloadmessage){Navigator.pushNamed(context,/messages);}}5. 请求通知权限在发送通知前检查并请求权限FuturevoidrequestNotificationPermission()async{if(!awaitPermission.notification.isGranted){awaitPermission.notification.request();}}常见问题Q1: 通知不显示怎么办A检查以下几点是否初始化了通知服务是否创建了通知通道Android 8.0是否授予了通知权限通知ID是否重复Q2: 如何自定义通知图标A在Android项目的res/mipmap目录添加图标文件然后在初始化时指定。Q3: 通知点击后如何传递数据A使用payload参数传递数据在点击回调中获取。Q4: 如何取消所有通知A调用cancelAll()方法取消所有通知。Q5: 定时通知在应用关闭后还会触发吗A会的定时通知由系统管理即使应用关闭也会触发。总结本地通知是Flutter应用中重要的用户交互方式通过flutter_local_notifications库可以实现丰富的通知功能。在鸿蒙平台上本地通知的实现与Android类似但需要注意权限配置和平台限制。选择合适的通知类型需要根据业务需求来决定类型适用场景特点即时通知消息提醒、操作反馈立即显示响应快定时通知闹钟、日程提醒精确控制时间周期通知每日提醒、周报推送自动重复无需重复配置希望本文能帮助你更好地理解和使用本地通知在Flutter应用中实现消息推送。

相关新闻