Android Flutter应用终止后如何修改通知数据并实现通知本地化
Android Flutter 应用终止后修改通知数据实现方案
应用被终止后Flutter主Isolate会被系统回收,必须依赖Android系统级的后台任务调度能力结合通知插件实现修改,具体步骤如下:
- 依赖核心插件:使用
flutter_local_notifications实现通知的增删改操作,搭配workmanager实现应用终止后的后台任务调度 - 基础配置:
- 初始化
flutter_local_notifications时开启androidAllowWhileIdle: true,保证低电耗模式下也能触发通知修改 - 初始化WorkManager时,回调入口必须用顶级静态函数,不能是类成员方法,否则应用被杀死后无法触发回调
// WorkManager初始化示例 await Workmanager().initialize( updateNotificationCallback, // 顶级静态回调函数 isInDebugMode: false, ); // 注册触发通知修改的后台任务,支持定时、周期性或者事件触发 await Workmanager().registerOneOffTask( 'modify_notification_task', 'modifyNotification', initialDelay: const Duration(minutes: 5), // 5分钟后触发修改 ); - 初始化
- 修改通知逻辑:所有通知都需要提前记录唯一ID,修改时调用
show方法传入相同ID即可直接覆盖原有通知,无需额外调用更新接口// 后台回调中执行的修改逻辑 void updateNotificationCallback() { Workmanager().executeTask((task, inputData) async { final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // 传入和原有通知一致的ID、ChannelID即可覆盖 await flutterLocalNotificationsPlugin.show( 1001, // 原有通知的ID '更新后的通知标题', '更新后的通知内容', const NotificationDetails( android: AndroidNotificationDetails( 'your_channel_id', // 和原有通知一致的ChannelID '渠道名称', ), ), ); return true; }); } - 权限适配:Android 12及以上版本需要提前申请
POST_NOTIFICATIONS、SCHEDULE_EXACT_ALARM权限,否则后台通知修改会被系统拦截
Flutter 通知本地化实现方案
根据通知触发的场景不同,对应实现方案分为两类:
- 前台运行场景:直接使用Flutter官方
flutter_localizations本地化套件,从ARB配置文件中读取当前系统语言对应的字符串,组装到通知内容后调用展示接口即可 - 后台/应用终止场景:此时Flutter本地化能力无法正常调用,需要将本地化逻辑下沉到Android原生侧处理:
- 在Android项目的
app/src/main/res目录下创建对应语言的资源文件夹,比如中文对应values-zh、英文对应values-en - 在各语言文件夹的
strings.xml中配置通知需要用到的字符串资源,示例如下:
<!-- values-en/strings.xml 英文配置 --> <string name="notify_new_order">New Order Reminder</string> <!-- values-zh/strings.xml 中文配置 --> <string name="notify_new_order">新订单提醒</string>- 后台任务触发通知时,原生侧直接调用
context.getString(R.string.notify_new_order)就能拿到当前系统语言对应的字符串,再组装成通知展示即可
- 在Android项目的
- 推送通知适配:如果是第三方推送触发的通知,可以直接在推送 payload 中配置本地化参数,Android系统会自动匹配当前语言展示对应文案,无需应用侧额外处理
内容的提问来源于stack exchange,提问作者Get Malone
相关产品推荐
相关产品推荐

