Android之Badge显⽰
生活随笔
收集整理的這篇文章主要介紹了
Android之Badge显⽰
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Badge概述
所謂Badge,原本是IOS上的一個效果,指的是當手機接收到推送消息后,會在手機桌?面對應的App圖標的右上角顯示一個未讀消息數的提?。
而在Android系統中,手機桌面的管理是在系統應用Launcher上實現的,然而在原生的Android系統中,Launcher是不提供改功能效果的。但是,由于Android的AOSP(Android開放源碼項目)代碼能夠被各大ROM廠商修改,所以很多被修改的ROM都可以支持這種Badge效果。
基本原理
都是監聽App發出的廣播,然后根據廣播內容進行Launcher層面的快捷方式的修改。
難點
由于沒有Android原生系統的支持,所以ROM廠商的實現方式很不統一,基本都是自己做自己的。因此,關鍵是要找到這些Launcher修改的廣播(廠家提供的私有API)。
不同廠商API
三星
String launcherClassName = getLauncherClassName(context); if (launcherClassName == null) { return; } 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);華為
String launcherClassName = getLauncherClassName(context); if (launcherClassName != null) { Bundle extra = new Bundle(); extra.putString("package", ct.getPackageName()); extra.putString("class", launcherClassName); extra.putInt("badgenumber", count); context.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, extra); }MIUI
- MIUI6以下
?
- MIUI6以上
?
Sony
Intent intent = new Intent(); String launcherclassname = getLauncherClassName(context); if (launcherclassname != null) { intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", unReadCount > 0); intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherclassname); intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", unReadCount < 1 ? "" : unReadCount); intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName()); context.sendBroadcast(intent); }VIVO
String launcherclassname = getLauncherClassName(context); if (launcherclassname != null) { Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM"); //Constants.KEY_PKG_NAME = "packageName" //Constants.KEY_CLASS_NAME = "className" intent.putExtra(Constants.KEY_PKG_NAME, context.getPackageName()); intent.putExtra(Constants.KEY_CLASS_NAME, launcherclassname); intent.putExtra("notificationNum", unReadCount); context.sendBroadcast(intent); }OPPO
try { Bundle extras = new Bundle(); extras.putInt("app_badge_count", count); context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", String.valueOf(count), extras); } catch (Throwable th) {}
Method: getLauncherClassName
public static String getLauncherClassName(Context context) {if(context == null){return null;} PackageManager pm = context.getPackageManager();Intent intent = new Intent("android.intent.action.MAIN");intent.addCategory("android.intent.category.LAUNCHER");try {for (ResolveInfo resolveInfo : pm.queryIntentActivities(intent, 0)) {if (resolveInfo.activityInfo.applicationInfo.packageName.equalsIgnoreCase(context.getPackageName())) {return resolveInfo.activityInfo.name;}}return null;} catch (Exception e) {return null;}}?
除了上述的代碼,還需要在清單文件聲明對應的權限
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE"/> <uses-permission android:name="com.sec.android.provider.badge.permission.READ"/> <uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/> <uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>Good Luck !
總結
以上是生活随笔為你收集整理的Android之Badge显⽰的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反编译工具Jadx
- 下一篇: Android如何优雅地防止Bean类混