Android 角标适配

简介: Android 角标适配

Android 角标适配

小米手机


默认逻辑

当应用向通知栏发送了一条通知 (除了进度条样式和常驻通知外),应用图标的右上角就会显示「1」。值得一提,角标的数字代表应用的通知数,即应用发送了「x」条通知,角标就会显示为「x」。

2. 开发者如何自定义角标数


如果开发者不满意默认逻辑,想要自定义角标的数字,可以通过调用接口告知系统,参考代码如下:

try {
    Field field = notification.getClass().getDeclaredField(“extraNotification”);
    Object extraNotification = field.get(notification);
    Method method = extraNotification.getClass().getDeclaredMethod(“setMessageCount”, int.class);
    method.invoke(extraNotification, mCount);
} catch (Exception e) {
    e.printStackTrace();
}

官网地址


华为

1、声明权限

< uses - permission android: name = "android.permission.INTERNET" / >
    <
    uses - permission android: name = "com.huawei.android.launcher.permission.CHANGE_BADGE " / >

2、在需要进行角标显示地方,采用如下方法传递数据给华为桌面应用。

Bundle extra = new Bundle();
extra.putString("package", "xxxxxx");
extra.putString("class", "yyyyyyy");
extra.putInt("badgenumber", i);
context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extra);

关键参数说明:


package:应用包名

class:桌面图标对应的应用入口Activity类

badgenumber:角标数字


示例:

boolean mIsSupportedBade = true;
if (mIsSupportedBade) {
    setBadgeNum(num);
}
/** set badge number*/
public void setBadgeNum(int num) {
    try {
        Bundle bunlde = new Bundle();
        bunlde.putString("package", "com.test.badge"); // com.test.badge is your package name
        bunlde.putString("class", "com.test. badge.MainActivity"); // com.test. badge.MainActivity is your apk main activity
        bunlde.putInt("badgenumber", num);
        this.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bunlde);
    } catch (Exception e) {
        mIsSupportedBade = false;
    }
}

特殊情形考虑:


对于第三应用打开和退出时,是否还继续显示角标取决应用传递的值(badgenumber为0时,不显示角标;badgenumber大于0时,显示角标)。

当第三方应用package和class发生变化时,需传递该变化后的信息。


官网地址


OPPO

若要使用角标功能,必须提交申请,审核通过了才能开放,官方给的具体审核标准如下:


申请角标接入规则(应用必须适配OPPO手机,保证角标功能测试通过)


a) 系统应用;


b) 国内外各区域用户量排名Top5的三方即时通讯类应用,且只允许显示即时通信消息类通知(如QQ、微信、facebook、line);


c) OPPO公司内部费商业化及运营性质的办公类型即时通信应用(如Teamtalk);


d) 国内外邮件类应用(各区域各属于用户量第一梯队的应用)


VIVO

申请都申请不了


三星

private static boolean setSamsungBadge(int count, Context context) {
        try {
            String launcherClassName = getLauncherClassName(context);
            if (TextUtils.isEmpty(launcherClassName)) {
                return false;
            }
            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);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


联想ZUK


声明权限

<uses-permission android:name="android.permission.READ_APP_BADGE"/> 
1
定义ContentProvider的uri
private final Uri CONTENT_URI = Uri.parse("content://" + "com.android.badge" + "/" + "badge"); 
1
3.写入对应的角标需要显示的数值,示例代码如下:
private void testreddot(Context context, int counts){       
Bundle extra = new Bundle();
ArrayList<String> ids = new ArrayList<String>();
// 以列表形式传递快捷方式id,可以添加多个快捷方式id
ids.add("custom_id_1");
ids.add("custom_id_2");
………………..
extra.putStringArrayList("app_shortcut_custom_id", ids);
extra.putInt("app_badge_count", counts);
Bundle b = null;
b = context.getContentResolver().call(CONTENT_URI,"setAppBadgeCount", null, extra);
boolean result = false;
if (b != null) {
result = true;
}else {
result = false;  
}  
return;
}


说明:


示例中ids这个参数可以为空或者“null”表示对主图标进行角标标记;custom_id_1等id值,是应用自定义的对应快捷方式的id,如果应用有快捷方式在桌面创建需要将此id传给桌面在后面将有说明。


这个例子中如果有多个id,那么表示多个id的角标值是一样的为counts。如果每个id有不同的值,需要分别循环调用并设置值,也就是一个id和对应counts值调用一次此接口。如果ids为null将更新主图标。


4.对需要在桌面创建快捷方式并有角标的应用需要在创建快捷方式的一个示例如下:

Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,getString(R.string.app_name));

// 快捷方式的名称


shortcut.putExtra("duplicate", false); // 不允许重复创建
Intent shortcutIntent = new Intent();
shortcutIntent.setClassName("com.example","com.example.MainActivity");
// com.example是包名,com.example.MainActivity是启动页类名
shortcutIntent.setPackage(packageName);
shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this, R.drawable.icon); // 快捷方式的图标
shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
shortcut.putExtra("app_shortcut_custom_id","example_custom_id");
// 以extra参数的形式传递shortcutCustomId
sendBroadcast(shortcut);
//系统接收到该广播,需将shortcutCustomId与图标的对应关系存储到数据库      
说明:setClassName不是必须的。

接口使用示例


仅仅对主图标进行角标设置


参数:


context 应用上下文;


counts 主图标的角标数量。


快捷方式角标设置


参数:

context 应用上下文;
 counts 快捷方式的角标数量;
 custom_id_1,custom_id_2 应用自己定义的值,这个值和创建快捷方式发送的广播中intent的值一致。

注意: 应用使用SDK后需要同时打开相关设置项才能生效。


设置 > 通知和状态栏 > 应用角标管理 在应用列表里打开您的应用的角标使用权限。


适用版本: ZUI 1.1 以上


官网地址


HTC

private static boolean setHTCBadge(int count, Context context) {
        try {
            ComponentName launcherComponentName = getLauncherComponentName(context);
            if (launcherComponentName == null) {
                return false;
            }
            Intent intent1 = new Intent("com.htc.launcher.action.SET_NOTIFICATION");
            intent1.putExtra("com.htc.launcher.extra.COMPONENT", launcherComponentName
                    .flattenToShortString());
            intent1.putExtra("com.htc.launcher.extra.COUNT", count);
            context.sendBroadcast(intent1);
            Intent intent2 = new Intent("com.htc.launcher.action.UPDATE_SHORTCUT");
            intent2.putExtra("packagename", launcherComponentName.getPackageName());
            intent2.putExtra("count", count);
            context.sendBroadcast(intent2);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

诺基亚

try {
    Field field = notification.getClass().getDeclaredField(“extraNotification”);
    Object extraNotification = field.get(notification);
    Method method = extraNotification.getClass().getDeclaredMethod(“setMessageCount”, int.class);
    method.invoke(extraNotification, mCount);
} catch (Exception e) {
    e.printStackTrace();
}

索尼

/**
     * Insert a badge associated with the specified package and activity names
     * asynchronously. The package and activity names must correspond to an
     * activity that holds an intent filter with action
     * "android.intent.action.MAIN" and category
     * "android.intent.category.LAUNCHER" in the manifest. Also, it is not
     * allowed to publish badges on behalf of another client, so the package and
     * activity names must belong to the process from which the insert is made.
     * To be able to insert badges, the app must have the PROVIDER_INSERT_BADGE
     * permission in the manifest file. In case these conditions are not
     * fulfilled, or any content values are missing, there will be an unhandled
     * exception on the background thread.
     *
     * @param badgeCount the badge count
     * @param packageName the package name
     * @param activityName the activity name
     */
    private void insertBadgeAsync(int badgeCount, String packageName, String activityName) {
        final ContentValues contentValues = new ContentValues();
        contentValues.put(BadgeProviderContract.Columns.BADGE_COUNT, badgeCount);
        contentValues.put(BadgeProviderContract.Columns.PACKAGE_NAME, packageName);
        contentValues.put(BadgeProviderContract.Columns.ACTIVITY_NAME, activityName);
        // The badge must be inserted on a background thread
        mQueryHandler.startInsert(0, null, BadgeProviderContract.CONTENT_URI, contentValues);
    }

GitHub地址


原生Android

接近原生Android手机:Pixel 、Nexus 、OnePlus;

前两个在国内很少有用的;OnePlus 用的也是稍稍的一部分

try {
    Field field = notification.getClass().getDeclaredField(“extraNotification”);
    Object extraNotification = field.get(notification);
    Method method = extraNotification.getClass().getDeclaredMethod(“setMessageCount”, int.class);
    method.invoke(extraNotification, mCount);
} catch (Exception e) {
    e.printStackTrace();
}
目录
相关文章
|
7月前
|
Web App开发 移动开发 小程序
"项目中mpaas升级到10.2.3 适配Android 14之后 app中的H5以及小程序都访问不了,
"项目中mpaas升级到10.2.3 适配Android 14之后 app中的H5以及小程序都访问不了,显示“网络不给力,请稍后再试”,预发内网版本不能使用,线上版本可以正常使用,这个是什么原因啊,是某些参数没有配置吗,还是说是一些参数改错了?
114 2
|
Android开发
Android 全屏适配刘海机型
Android 全屏适配刘海机型
187 0
|
3月前
|
调度 Android开发 UED
Android经典实战之Android 14前台服务适配
本文介绍了在Android 14中适配前台服务的关键步骤与最佳实践,包括指定服务类型、请求权限、优化用户体验及使用WorkManager等。通过遵循这些指南,确保应用在新系统上顺畅运行并提升用户体验。
251 6
|
5月前
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
|
4月前
|
安全 Java Android开发
Android 14适配Google play截止时间临近,适配注意点和经验
本文介绍了Android 14带来的关键更新,包括性能优化、定制化体验、多语言支持、多媒体与图形增强等功能。此外,还强调了适配时的重要事项,如targetSdkVersion升级、前台服务类型声明、蓝牙权限变更等,以及安全性与用户体验方面的改进。开发者需按官方指南更新应用,以充分利用新特性并确保兼容性和安全性。
299 0
|
存储 5G API
Android 11 来袭,一起来看看怎么适配(三)
Android 11 来袭,一起来看看怎么适配
|
安全 Shell 测试技术
Android 11 来袭,一起来看看怎么适配(二)
Android 11 来袭,一起来看看怎么适配
|
7月前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
736 4
|
安全 API 开发工具
Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?(下)
Android14 适配之——targetSdkVersion 升级到 34 需要注意些什么?(下)
1351 0
|
存储 缓存 安全
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
535 0