日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android之Badge显⽰

發(fā)布時(shí)間:2024/9/30 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之Badge显⽰ 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Badge概述

所謂Badge,原本是IOS上的一個(gè)效果,指的是當(dāng)手機(jī)接收到推送消息后,會(huì)在手機(jī)桌?面對(duì)應(yīng)的App圖標(biāo)的右上角顯示一個(gè)未讀消息數(shù)的提?。

而在Android系統(tǒng)中,手機(jī)桌面的管理是在系統(tǒng)應(yīng)用Launcher上實(shí)現(xiàn)的,然而在原生的Android系統(tǒng)中,Launcher是不提供改功能效果的。但是,由于Android的AOSP(Android開放源碼項(xiàng)目)代碼能夠被各大ROM廠商修改,所以很多被修改的ROM都可以支持這種Badge效果。

基本原理

都是監(jiān)聽App發(fā)出的廣播,然后根據(jù)廣播內(nèi)容進(jìn)行Launcher層面的快捷方式的修改。

難點(diǎn)

由于沒有Android原生系統(tǒng)的支持,所以ROM廠商的實(shí)現(xiàn)方式很不統(tǒng)一,基本都是自己做自己的。因此,關(guān)鍵是要找到這些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以下
    Intent intent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE"); intent.putExtra("android.intent.action.APPLICATION_MESSAGE_UPDATE","your app packageName/.LAUNCHER ActivityName"); intent.putExtra(EXTRA_UPDATE_APPLICATION_MESSAGE_TEXT, unreadCount); context.sendBroadcast(intent);

    ?

    • MIUI6以上
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context).setSmallIcon(R.mipmap.ic_launcher).setContentTitle("小米角標(biāo)").setContentText("miui桌面角標(biāo)消息");NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);Notification notification = builder.build();try {Object miuiNotification = Class.forName("android.app.MiuiNotification").newInstance();Field field = miuiNotification.getClass().getDeclaredField("messageCount");field.setAccessible(true);field.set(miuiNotification, Integer.valueOf(count));notification.getClass().getField("extraNotification").set(notification, miuiNotification);managerCompat.notify(0, notification);} catch (Exception e) {e.printStackTrace();}

    ?

  • 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;}}

?

除了上述的代碼,還需要在清單文件聲明對(duì)應(yīng)的權(quán)限

<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 !

總結(jié)

以上是生活随笔為你收集整理的Android之Badge显⽰的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。