• 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添加到项目中;然后根据需要修改下面的类文件。

    主流机型适配介绍

    华为

    华为桌面角标开发指导书

    参考:

    小米

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

    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

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

     新建的空的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

    参考资料

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

    leolin310148/ShortcutBadger

    xuyisheng/ShortcutHelper

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

    安卓应用角标那些事儿

    Android 角标学习总结

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

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

  • 相关阅读:
    LINQ查询表达式(5)
    LINQ查询表达式(4)
    并不对劲的loj2279
    并不对劲的bzoj1563:p1912:[NOI2009]诗人小G
    并不对劲的loj507
    并不对劲的loj2332
    并不对劲的loj6191
    并不对劲的bzoj4552:p2824:[HEOI2016/TJOI2016]排序
    并不对劲的bzoj3924:loj2135:p3345:[ZJOI2015]幻想乡战略游戏
    并不对劲的bzoj3295:[CQOI2011]动态逆序对
  • 原文地址:https://www.cnblogs.com/whycxb/p/10081963.html
Copyright © 2020-2023  润新知