React Native安卓端如何在通知清除后持久显示应用角标计数?
在React Native安卓上持久显示应用角标的解决方案
安卓系统本身没有统一的应用角标标准,不同厂商(小米、华为、OPPO、vivo等)都有各自的私有API来实现角标,而setApplicationIconBadgeNumber本质上是依赖系统通知的关联计数,一旦通知被清除,角标就会跟着消失。要实现不依赖通知的持久角标,需要针对不同厂商适配私有API,并手动维护计数。
核心思路
- 脱离系统通知关联:直接调用厂商私有API设置角标,不与通知绑定
- 持久化存储计数:把角标计数存在本地(如AsyncStorage/MMKV),确保应用重启或通知清除后能恢复
- 适配多厂商:借助第三方库封装不同厂商的实现,减少原生代码开发
具体实现步骤
1. 使用第三方角标库
推荐使用react-native-badge-library,它封装了主流安卓厂商的角标API:
# 安装库 npm install react-native-badge-library # 或 yarn add react-native-badge-library
2. 持久化维护计数
用MMKV(性能优于AsyncStorage)存储当前角标计数:
import MMKVStorage from 'react-native-mmkv-storage'; import { BadgeLibrary } from 'react-native-badge-library'; // 初始化MMKV const storage = new MMKVStorage.Loader().initialize(); // 更新角标并存储计数 const updateBadgeCount = async (count) => { // 存储计数到本地 await storage.setNumber('badgeCount', count); // 调用库设置角标 await BadgeLibrary.setBadgeCount(count); }; // 应用启动时恢复角标 const restoreBadgeCount = async () => { const count = await storage.getNumber('badgeCount', 0); await BadgeLibrary.setBadgeCount(count); }; // 在App组件的useEffect中调用恢复 useEffect(() => { restoreBadgeCount(); }, []);
3. 处理厂商权限
部分厂商需要特定权限才能设置角标:
- 小米/红米:需要开启「通知使用权」权限,可引导用户到系统设置开启
- 华为/荣耀:库已自动配置
com.huawei.android.launcher.permission.CHANGE_BADGE权限 - OPPO/vivo:需要在应用设置中开启「应用角标」权限
可在应用首次启动时添加权限引导:
const checkBadgePermission = async () => { const hasPermission = await BadgeLibrary.hasPermission(); if (!hasPermission) { // 引导用户开启权限 await BadgeLibrary.requestPermission(); } };
4. 避免通知清除影响
因为我们是直接调用厂商API设置角标,没有绑定系统通知,所以即使所有通知被清除,角标依然会保留。只有当主动调用updateBadgeCount(0)时,角标才会消失。
注意事项
- 部分安卓版本或厂商可能不支持角标,需做降级处理(比如提示用户设备不支持)
- 测试时要覆盖主流厂商设备,确保各机型都能正常显示
- 完全用第三方库的API替代
setApplicationIconBadgeNumber,避免依赖系统通知关联
内容的提问来源于stack exchange,提问作者Adnan Ashraf
相关产品推荐
相关产品推荐

