You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 12:08:13