ShortcutBadgerDemo【安卓应用角标(badge)实现方案】 概述 什么是应用角标? 如何支持应用角标? 角标实现方案 主流机型适配介绍 集成ShortcutBadger 项目结构 小米设备上运行效果图 总结 项目Demo下载地址 参考资料

 版权声明:本文为HaiyuKing原创文章,转载请注明出处!

本文主要使用的开源库是 leolin310148/ShortcutBadger,但是在其基础上做了一些修改。

什么是应用角标?

1、角标,英文名badge,即桌面上显示未读消息的小数字,原ios功能,Android原生并没有该功能。(原生的Android系统,是不支持应用角标的)

应用角标最开始是在ios系统中出现的,大概长这样:

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

不知道从什么时候开始,国内各大安卓手机系统上,也慢慢出现了应用角标的身影,到现在几乎成为了安卓系统的标配。

2、目前被大部分android厂商所支持,但都是厂商自己支持,所以要考虑不同品牌的兼容问题。

3、应用角标是一个带有争议的设计,有些强迫症用户对应用角标咬牙切齿,有些用户看不到应用角标又浑身痒痒。

如何支持应用角标?

1、安卓应用的角标是由Launcher支持的,而原生的Android系统Launcher并没有提供角标支持,所以各大手机厂商只能自己定制Launcher来实现,然后提供接口给外部使用。

2、主流的做法都是通过广播Intent的形式来提供接口,不同的手机系统所支持的广播Intent也不太一样,所以需要针对不同的手机系统来做适配(恭喜你又成功跳入一个系统适配的坑!)。

3、添加角标的原理就是发送一个Broadcast(广播),在广播的Intent中指定需要被添加角标的应用的packageName(包名),className(类名),count(角标数目)。当然了,不同厂商的手机的角标操作的Intent的action是不一样的。

4、这里需要注意的是,是否支持角标并不与手机厂商有关,而是你当前使用的launcher开发厂商有关。

比如:你用着华为手机,却用着魅族的launcher,那肯定是不会成功的显示出桌面角标的;

相反的,你用着某一款手机却用着华为的launcher,一样可以显示出桌面图标角标。

角标实现方案

方案:使用开源库leolin310148/ShortcutBadger,然后对比主流机型上的代码是否官网最新代码,更新到最新代码

将开源库leolin310148/ShortcutBadger的代码下载下来,作为一个module添加到项目中;然后根据需要修改下面的类文件。

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

主流机型适配介绍

华为

华为桌面角标开发指导书

参考:

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

小米

MIUI6&7桌面角标开源代码简介 

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

oppo

oppo开放平台

oppo角标提醒目前只针对内部软件还有微信、QQ开放,其他的暂时无法提供。

OPPO,R9后台的通知设置里,有显示角标的选项,事实上该选项并不是对所有app开放的,就微信、QQ等国民应用有打开该选项的权限,目测是OPPO做了白名单限制,对这些机型也没有办法。

vivo

官网上没有说明。

网上的实现方案:参考leolin310148/ShortcutBadger中的VivoHomeBadger.java类。

/**
 * @author leolin
 */
public class VivoHomeBadger implements Badger {

    @Override
    public void executeBadge(Context context, ComponentName componentName, int badgeCount) throws ShortcutBadgeException {
        Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
        intent.putExtra("packageName", context.getPackageName());
        intent.putExtra("className", componentName.getClassName());
        intent.putExtra("notificationNum", badgeCount);
        context.sendBroadcast(intent);
    }

    @Override
    public List<String> getSupportLaunchers() {
        return Arrays.asList("com.vivo.launcher");
    }
}

集成ShortcutBadger

1、新建module

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

 注意:包名建议跟第三方库的包名一致。

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

 新建的空的module如下:

 ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

2、将下面的文件复制到shortcutbadge这个module中

将从第三方库中下面的文件复制到module中。

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

效果如下:

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

 3、在这个module的AndroidManifest.xml文件中添加以下代码

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="me.leolin.shortcutbadger">
    <!--for android-->
    <!--<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>-->
    <!--<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS"/>-->
    <!--<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />-->
    <!--<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />-->

    <!--for Samsung-->
    <uses-permission android:name="com.sec.android.provider.badge.permission.READ"/>
    <uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/>

    <!--for htc-->
    <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS"/>
    <uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT"/>

    <!--for sony-->
    <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE"/>
    <uses-permission android:name="com.sonymobile.home.permission.PROVIDER_INSERT_BADGE"/>

    <!--for apex-->
    <uses-permission android:name="com.anddoes.launcher.permission.UPDATE_COUNT"/>

    <!--for solid-->
    <uses-permission android:name="com.majeur.launcher.permission.UPDATE_BADGE"/>

    <!--for huawei-->
    <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
    <uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS"/>
    <uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS"/>

    <!--for ZUK-->
    <uses-permission android:name="android.permission.READ_APP_BADGE"/>

    <!--for OPPO-->
    <uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS"/>
    <uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS"/>

    <!--for EvMe-->
    <uses-permission android:name="me.everything.badger.permission.BADGE_COUNT_READ"/>
    <uses-permission android:name="me.everything.badger.permission.BADGE_COUNT_WRITE"/>
</manifest>

 4、在这个module的proguard-rules.pro文件中添加以下代码,进行代码混淆

#https://github.com/leolin310148/ShortcutBadger/issues/46
-keep class me.leolin.shortcutbadger.impl.** { <init>(...); }

5、在这个module的build.gradle中修改minifyEnabled的值为true【用于代码混淆】

apply plugin: 'com.android.library'

android {
    compileSdkVersion rootProject.ext.globalCompileSdkVersion

    defaultConfig {
        minSdkVersion rootProject.ext.globalMinSdkVersion
        targetSdkVersion rootProject.ext.globalTargetSdkVersion
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

6、在APP的build.gradle中引用shortcutbadger这个module

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.why.project.shortcutbadgerdemo"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    //引用shortcutbadger
    implementation project(':shortcutbadger')
}

7、至此可以使用了,不过如果想要实现小米设备上的角标功能,需要在shortcutbadger这个module中添加以下文件

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

其中badger_notification_icon.png文件是背景透明,前景图标的48X48的图标(demo中借用的是极光推送的图标):

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

然后在APP的module的AndroidManifest.xml文件中<application节点下注册服务

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.why.project.shortcutbadgerdemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <!--注册小米设备的角标服务【应用角标功能相关】【不建议在小米设备上使用,因为小米上只要打开APP,角标就会消失,目前项目中用不到】-->
        <service
            android:name="me.leolin.shortcutbadger.BadgeIntentService"
            android:exported="false"></service>
    </application>

</manifest>

8、使用

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

package com.why.project.shortcutbadgerdemo;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import me.leolin.shortcutbadger.ShortcutBadgeException;
import me.leolin.shortcutbadger.ShortcutBadger;

public class MainActivity extends AppCompatActivity {

    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;

        //一般设备上的显示角标的代码--可以结合RomUtil进行机型判断
        try {
            ShortcutBadger.applyCountOrThrow(mContext, 9);
        } catch (ShortcutBadgeException e) {
            e.printStackTrace();
            //如果还没有提示过toast,则进行提示
            Toast.makeText(mContext,"本APP暂时无法在该设备上实现应用角标功能",Toast.LENGTH_SHORT).show();
        }

        //下面是小米设备上的显示角标的关键代码--可以结合RomUtil进行机型判断
        /*finish();//在小米设备上APP打开着的情况下,是不显示角标的,只有APP关闭了才会显示角标
        startService(new Intent(MainActivity.this, BadgeIntentService.class).putExtra("badgeCount", 9));*/
    }
}

项目结构

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

小米设备上运行效果图

注意:通知栏中会有一个空白通知。

ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

 ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
概述
什么是应用角标?
如何支持应用角标?
角标实现方案
主流机型适配介绍
集成ShortcutBadger
项目结构
小米设备上运行效果图
总结
项目Demo下载地址
参考资料

总结

Android的角标添加和移除毕竟是基于各大手机厂商的Launcher的定制,因此不是正统的Android技巧,随着厂商的Launcher的改变,也许你的代码未来就不一定有用了,因此需要不断修改,“推陈出新”。

项目Demo下载地址

https://github.com/haiyuKing/ShortcutBadgerDemo

参考资料

Android上的Badge,快速实现给应用添加角标

leolin310148/ShortcutBadger

xuyisheng/ShortcutHelper

android 应用图标 角标 显示未读消息

安卓应用角标那些事儿

Android 角标学习总结

Android探索之旅 | 为应用添加角标(Badge)

android 为桌面图标添加数字角标