Android之Badge显⽰

本文介绍了Android中的Badge效果,源于iOS,用于显示未读消息数。由于原生Android不支持,该功能主要由各厂商ROM实现。内容涉及Badge的基本原理,实现难点在于不同厂商的API不统一,需要监听广播并修改Launcher快捷方式。文章列举了部分厂商如三星、华为、MIUI等的实现方法,并提及了权限声明的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Badge概述

所谓Badge,原本是IOS上的一个效果,指的是当手机接收到推送消息后,会在手机桌⾯面对应的App图标的右上角显示一个未读消息数的提⽰。

而在Android系统中,手机桌面的管理是在系统应用Launcher上实现的,然而在原生的Android系统中,Launcher是不提供改功能效果的。但是,由于Android的AOSP(Android开放源码项目)代码能够被各大ROM厂商修改,所以很多被修改的ROM都可以支持这种Badge效果。

基本原理

都是监听App发出的广播,然后根据广播内容进行Launcher层面的快捷方式的修改。

难点

由于没有Android原生系统的支持,所以ROM厂商的实现方式很不统一,基本都是自己做自己的。因此,关键是要找到这些Launcher修改的广播(厂家提供的私有API)。

不同厂商API

  • 三星

    String launcherClassName = getLauncherClassName(context);
    if (launcherClassName == null) {
    return;
    }
    Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
    intent.putExtra("badge_count", count);
    intent.putExtra("badge_count_package_name", context.getPackageName());
    intent.putExtra("badge_count_class_name", launcherClassName);
    context.sendBroadcast(intent);
  • 华为

    String launcherClassName = getLauncherClassName(context);
    if (launcherClassName != null) {
    Bundle extra = new Bundle();
    extra.putString("package", ct.getPackageName());
    extra.putString("class", launcherClassNam
### Android 自定义 Badge 实现教程 #### 1. 创建自定义 View 组件 为了实现 Badge 功能,可以创建一个新的 `BadgeView` 类继承自 `TextView` 或者其他合适的视图组件。通过这种方式能够更好地控制徽章的外观和行为。 ```java public class BadgeView extends TextView { public BadgeView(Context context) { super(context); init(); } public BadgeView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { setPadding(8, 4, 8, 4); // 设置内边距使文字居中示更美观 setBackgroundResource(R.drawable.badge_background); // 应用背景资源文件来设置圆角矩形样式 setTextSize(TypedValue.COMPLEX_UNIT_SP, 12f); // 调整字体大小以适应不同屏幕分辨率 setTextColor(Color.WHITE); // 文字颜色设为白色以便于阅读 } } ``` 此部分代码展示了如何构建一个简单的自定义视图类用于表示通知数量或其他形式的小红点提示[^4]。 #### 2. 定义布局 XML 文件中的 Badge 属性 接下来,在应用界面设计时可以通过 XML 布局文件引入这个新的控件,并为其指定位置和其他属性: ```xml <com.example.BadgeView android:id="@+id/badge" android:layout_width="wrap_content" android:layout_height="wrap_content" app:badge_number="5" /> ``` 这里假设已经将上述 Java 类放置在一个名为 `com.example` 的包路径下;同时注意使用命名空间前缀 (`app:`) 来访问自定义属性。 #### 3. 更新数据源并刷新 UI 示 当应用程序接收到新消息或者其他需要更新 Badge 数量的情况发生时,则应该及时修改对应的数据模型对象,并调用相应的 setter 方法触发重新绘制操作: ```java // 获取到之前声明好的实例化后的 BadgeView 对象 BadgeView badge = findViewById(R.id.badge); // 修改内部存储的消息计数值 badge.setNumber(newMessageCount); // 如果当前没有未读项则隐藏该部件以免影响用户体验 if (newMessageCount == 0){ badge.setVisibility(View.GONE); } else { badge.setVisibility(View.VISIBLE); } ``` 这段逻辑可以帮助开发者轻松管理界面上动态变化的内容而无需频繁重建整个 Activity 或 Fragment 结构。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值