开发Android Launcher时如何获取应用的整数类型未读计数
解决Android Launcher获取应用未读角标计数的问题
嘿,我之前开发Launcher时也踩过这个一模一样的坑!Android本身没有统一的系统API能直接获取所有应用的未读消息数,得根据不同场景来适配,下面给你梳理几个可行的方案:
一、系统通知监听服务(最通用的核心方案)
从Android 4.3(API 18)开始,系统提供了NotificationListenerService,可以监听所有应用的通知发布、移除事件,我们可以通过这个服务统计每个应用的未读通知数量——这也是市面上大多数Launcher的核心实现方式。
步骤1:创建自定义监听服务
public class AppNotificationListener extends NotificationListenerService { // 存储每个应用的未读计数 private final Map<String, Integer> appUnreadMap = new HashMap<>(); @Override public void onNotificationPosted(StatusBarNotification sbn) { super.onNotificationPosted(sbn); String pkgName = sbn.getPackageName(); // 只统计不可清除的通知(一般对应未读消息) if (!sbn.isClearable()) { int currentCount = appUnreadMap.getOrDefault(pkgName, 0); appUnreadMap.put(pkgName, currentCount + 1); } // 通知Launcher更新角标UI notifyLauncherUpdateBadge(); } @Override public void onNotificationRemoved(StatusBarNotification sbn) { super.onNotificationRemoved(sbn); String pkgName = sbn.getPackageName(); int currentCount = appUnreadMap.getOrDefault(pkgName, 0); if (currentCount > 0) { currentCount--; if (currentCount == 0) { appUnreadMap.remove(pkgName); } else { appUnreadMap.put(pkgName, currentCount); } } notifyLauncherUpdateBadge(); } private void notifyLauncherUpdateBadge() { // 这里写更新Launcher应用图标角标的逻辑 // 比如通过广播、接口回调通知主界面刷新UI } }
步骤2:在Manifest中注册服务
<service android:name=".AppNotificationListener" android:label="通知监听服务" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service>
步骤3:引导用户授权
这个服务需要用户手动在系统设置中开启权限,所以要在Launcher首次启动时引导用户跳转设置页面:
private void requestNotificationPermission() { Intent settingIntent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); startActivity(settingIntent); }
二、适配厂商私有API(补充方案)
国内主流厂商(小米、华为、三星等)都有自己的私有角标API,部分可以直接获取或设置应用未读计数,但这些API兼容性不稳定,建议只作为补充:
- 小米:使用
BadgeManager类,需添加权限android.permission.ACCESS_NOTIFICATION_POLICY,通过反射或直接调用API操作计数; - 华为:使用
HwBadger类,调用setBadgeNumber方法设置角标; - 三星:通过
LauncherApps相关API获取带角标的应用图标,间接获取计数。
注意:这些私有API可能随厂商系统版本更新而变动,不要作为核心依赖。
三、第三方封装库(简化适配)
如果不想自己挨个适配厂商,可以用ShortcutBadger这类第三方库,它封装了大部分主流厂商的角标设置逻辑,能快速实现角标展示,但获取计数仍需结合通知监听服务——这类库更多是用来设置角标,而非获取计数。
关键注意事项
- 有些应用的未读计数(比如本地短信、邮件)不通过系统通知展示,这种情况Launcher很难直接获取,除非通过ContentProvider读取对应应用的数据库,但需要对应权限且不同应用存储结构差异大,通用性极差;
- 通知监听服务可能被用户关闭,要在Launcher中做权限检测,当权限失效时及时提示用户重新开启。
内容的提问来源于stack exchange,提问作者Amit Kumar Sahu
相关产品推荐
相关产品推荐

