ShortcutBadgerDemo【安卓应用角标(badge)实现方案】
版权声明:本文为HaiyuKing原创文章,转载请注明出处!
概述
本文主要使用的开源库是 leolin310148/ShortcutBadger,但是在其基础上做了一些修改。
什么是应用角标?
1、角标,英文名badge,即桌面上显示未读消息的小数字,原ios功能,Android原生并没有该功能。(原生的Android系统,是不支持应用角标的)
应用角标最开始是在ios系统中出现的,大概长这样:

不知道从什么时候开始,国内各大安卓手机系统上,也慢慢出现了应用角标的身影,到现在几乎成为了安卓系统的标配。
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添加到项目中;然后根据需要修改下面的类文件。

主流机型适配介绍
华为
参考:



小米


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

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

新建的空的module如下:

2、将下面的文件复制到shortcutbadge这个module中
将从第三方库中下面的文件复制到module中。

效果如下:

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中添加以下文件

其中badger_notification_icon.png文件是背景透明,前景图标的48X48的图标(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、使用

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));*/
}
}
项目结构


小米设备上运行效果图
注意:通知栏中会有一个空白通知。


总结
Android的角标添加和移除毕竟是基于各大手机厂商的Launcher的定制,因此不是正统的Android技巧,随着厂商的Launcher的改变,也许你的代码未来就不一定有用了,因此需要不断修改,“推陈出新”。
项目Demo下载地址
https://github.com/haiyuKing/ShortcutBadgerDemo
参考资料
ShortcutBadgerDemo【安卓应用角标(badge)实现方案】的更多相关文章
- Android上的Badge,快速实现给应用添加角标
应用角标是iOS的一个特色,原生Android并不支持.或许是因为当时iOS的通知栏比较鸡肋(当然现在已经改进了很多),而Android的通知栏功能强大?所以才出现了一方依赖于数字角标,一方坚持强大的 ...
- ShortcutBadger添加桌面角标(Badge)
1.简介:角标原本是苹果的ios中的东西,android原生并不支持角标,因为google的意思是让大家用notification(提示栏)即可,不过无妨,厉害的android第三方厂商可以通过在自定 ...
- android 桌面图标添加数字角标
是否支持角标并不与手机厂商有关,而是你当前使用的launcher开发厂商有关. 方法实现: import android.app.Application; import android.app.Not ...
- Android 为应用添加数字角标
今天在论坛上看到了一个帖子,终于搞清了我很久以来的一个困惑,android到底能不能实现ios的角标效果,QQ是怎么实现的.看了这个帖子顿时终于解除了我的困惑. 先说一个下大概的思路: 大家都知道an ...
- JS和jQuery中ul li遍历获取对应的下角标
首先先看代码: html代码部分: <div id="div"> <ul> <li>1111111</li> <li>2 ...
- 应用程序添加角标和tabBar添加角标,以及后台运行时显示
1.设置角标的代码: // 从后台取出来的数据可能是int型的不能直接给badgeValue(string类型的),需要通过description转化 NSString *count = [re ...
- iOS 未读消息角标 仿QQ拖拽 简单灵活 支持xib(源码)
一.效果 二.简单用法 超级简单,2行代码集成:xib可0代码集成,只需拖一个view关联LFBadge类即可 //一般view上加角标 _badge1 = [[LFBadge alloc] init ...
- React-Native 之 GD (十二)海淘半小时热门 及 获取最新数据个数功能 (角标)
1.海淘半小时热门 基本功能和首页相似 GDHt.js /** * 海淘折扣 */ import React, { Component } from 'react'; import { Style ...
- 通知角标(2)只用一个TextView实现
可以只用一个TextView实现通知角标,TextView的setCompoundDrawables函数可以在TextView的上,下,左,右,4条边处分别指定一个图片.见图1: 这个图片如果在角上, ...
随机推荐
- php坏境安装Xdebug详情步骤
原创,转载请注明出处! Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况,可以说是程序员必备的一个工具之一.好了,进入正题: 1.下 ...
- Solr(三)向solr-5.5.4中添加数据
Solr添加数据 一 首先在创建好的CORE中添加自己需要的Field(可以理解为表的字段) 1 切换到配置Field的文件目录,编辑配置Field的文件 managed-schema cd /usr ...
- python while 循环语句
Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句-- 执行语句可以是单个语句或语句 ...
- FastDFS单机版安装
FastDFS 分布式文件系统 1 目标 了解项目中使用FastDFS的原因和意义. 掌握FastDFS的架构组成部分,能说出tracker和storage的作用. 了解FastDFS+nginx上传 ...
- 关于C#中程序功能实现,对代码选择的思考
body { background-color: rgb(60,60,60) } 接触C#语言只有短短几天时间,想要写出什么高大上的深入性研究文章,估计也是满篇的猜想和一些没有逻辑的推断.截至目前而言 ...
- python2.7 的中文编码处理,解决UnicodeEncodeError: 'ascii' codec can't encode character 问题
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- js算法初窥02(排序算法02-归并、快速以及堆排序)
上一篇,我们讲述了一些简单的排序算法,其实说到底,在前端的职业生涯中,不涉及node.不涉及后台的情况下,我目前还真的没想到有哪些地方可以用到这些数据结构和算法,但是我在前面的文章也说过了.或许你用不 ...
- Ubuntu 18.04 on Windows 10 更改 Oh-My-Zsh agnoster 主题下的目录背景色
题外话 我的 MacBook Pro 已经使用了6年多的时间,尽管作为一个 .NET 程序员绝大部分时间都是在 Windows 下工作,直到 .NET Core 的逐步成熟.要说 Mac OS,最满意 ...
- 架构选型之Nodejs与Java
前言: 身边越来越多的同事谈论Nodejs,谈其异步IO.事件回调.前后台统一一门语言,创业的朋友的第一个创业项目也选择了Nodejs,期望能够使用一种语言节省成本快速完成需求开发.与其他项目组的同事 ...
- dva/docs/GettingStarted.md
进入目录安装依赖: npm i 或者 yarn install开发: npm run dev npm install 太慢,试试yarn吧.建议用npm install yarn -g进行安装. Co ...