ShortcutBadgerDemo【安卓應用角標(badge)實現方案】

 版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!css

概述

本文主要使用的開源庫是 leolin310148/ShortcutBadger,可是在其基礎上作了一些修改。html

什麼是應用角標?

一、角標,英文名badge,即桌面上顯示未讀消息的小數字,原ios功能,Android原生並無該功能。(原生的Android系統,是不支持應用角標的)java

應用角標最開始是在ios系統中出現的,大概長這樣:android

不知道從何時開始,國內各大安卓手機系統上,也慢慢出現了應用角標的身影,到如今幾乎成爲了安卓系統的標配。ios

二、目前被大部分android廠商所支持,但都是廠商本身支持,因此要考慮不一樣品牌的兼容問題。git

三、應用角標是一個帶有爭議的設計,有些強迫症用戶對應用角標咬牙切齒,有些用戶看不到應用角標又渾身癢癢。github

如何支持應用角標?

一、安卓應用的角標是由Launcher支持的,而原生的Android系統Launcher並無提供角標支持,因此各大手機廠商只能本身定製Launcher來實現,而後提供接口給外部使用。微信

二、主流的作法都是經過廣播Intent的形式來提供接口,不一樣的手機系統所支持的廣播Intent也不太同樣,因此須要針對不一樣的手機系統來作適配(恭喜你又成功跳入一個系統適配的坑!)。app

三、添加角標的原理就是發送一個Broadcast(廣播),在廣播的Intent中指定須要被添加角標的應用的packageName(包名),className(類名),count(角標數目)。固然了,不一樣廠商的手機的角標操做的Intent的action是不同的。ide

四、這裏須要注意的是,是否支持角標並不與手機廠商有關,而是你當前使用的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

一、新建module

 注意:包名建議跟第三方庫的包名一致。

 新建的空的module以下:

 

二、將下面的文件複製到shortcutbadge這個module中

將從第三方庫中下面的文件複製到module中。

效果以下:

 三、在這個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>

 四、在這個module的proguard-rules.pro文件中添加如下代碼,進行代碼混淆

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

五、在這個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'
}

六、在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')
}

七、至此可使用了,不過若是想要實現小米設備上的角標功能,須要在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>

八、使用

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 爲桌面圖標添加數字角標

相關文章
相關標籤/搜索