桌面ICON的数字图标来Android原生系统是不支持应用桌面角标(BadgeNumber
)显示的。我们目前看到的能支持应用桌面角标显示的Android系统,都是第三方厂商自己定制的。通过实现一套自己的launcher
并且提供外部接口给第三方应用来调用即可
目前适配的机型有华为、三星
1.华为手机
先在manifest配置如下权限
<!-- 设置华为角标的显示 -->
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
调用方法
/**
* 设置华为手机的icon数字图标
*
* @param mContext
* @param num
*/
private static void setHuaWeiBadgeNum(Context mContext, int num) {
try {
String pname = mContext.getPackageName();
String launchClass = mContext.getPackageManager().getLaunchIntentForPackage(pname).getComponent().getClassName();
Bundle bunlde = new Bundle();
bunlde.putString("package", pname);
bunlde.putString("class", launchClass);
bunlde.putInt("badgenumber", num);
mContext.getContentResolver().call(Uri.parse("content://com.huawei.android.launcher.settings/badge/"), "change_badge", null, bunlde);
} catch (Exception e) {
MyLog.e(e);
}
}
2.三星手机
先在manifest配置如下权限
<!-- 设置三星角标的显示 -->
<uses-permission android:name="com.sec.android.provider.badge.permission.READ" />
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" />
调用方法
/**
* 设置三星手机的icon数字图标
*
* @param mContext
* @param num
*/
private static void setSamSungBadgeNum(Context mContext, int num) {
try {
String pname = mContext.getPackageName();
String launchClass = mContext.getPackageManager().getLaunchIntentForPackage(pname).getComponent().getClassName();
Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
intent.putExtra("badge_count", num);
intent.putExtra("badge_count_package_name", pname);
intent.putExtra("badge_count_class_name", launchClass);
mContext.sendBroadcast(intent);
} catch (Exception e) {
MyLog.e(e);
}
3.OPPO
public static void setBadgeNumber(Context context, int number) { try { if (number == 0) { number = -1; } Intent intent = new Intent("com.oppo.unsettledevent"); intent.putExtra("pakeageName", context.getPackageName()); intent.putExtra("number", number); intent.putExtra("upgradeNumber", number); if (canResolveBroadcast(context, intent)) { context.sendBroadcast(intent); } else { try { Bundle extras = new Bundle(); extras.putInt("app_badge_count", number); context.getContentResolver().call(Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, extras); } catch (Throwable t) { t.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } public static boolean canResolveBroadcast(Context context, Intent intent) { PackageManager packageManager = context.getPackageManager(); List<ResolveInfo> receivers = packageManager.queryBroadcastReceivers(intent, 0); return receivers != null && receivers.size() > 0; }
4.VIVO
public static void setBadgeNumber(Context context, int number) {
try {
Intent intent = new Intent("launcher.action.CHANGE_APPLICATION_NOTIFICATION_NUM");
intent.putExtra("packageName", context.getPackageName());
String launchClassName = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()).getComponent().getClassName();
intent.putExtra("className", launchClassName);
intent.putExtra("notificationNum", number);
context.sendBroadcast(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
5.小米:
小米的设置应用角标方式比较有个性,跟其他厂商的不太一样,是跟Notification
绑定在一起的。而且小米系统还有个比较特殊的地方,如果在应用内直接调用设置角标的方法,设置角标会不生效,所以只能在应用在后台并且收到推送的情况下进行角标的设置。另外,即使你设置了角标的显示,只要用户点击应用图标进入到应用内,应用的角标就会自动消失掉,即使应用内还存在新的未读消息。所以,针对小米机型,建议在收到推送后并且进行notification的时机更新应用角标。
//在调用NotificationManager.notify(notifyID, notification)这个方法之前先设置角标显示的数目
public static void setBadgeNumber(Notification notification, int number) {
try {
Field field = notification.getClass().getDeclaredField("extraNotification");
Object extraNotification = field.get(notification);
Method method = extraNotification.getClass().getDeclaredMethod("setMessageCount", int.class);
method.invoke(extraNotification, number);
} catch (Exception e) {
e.printStackTrace();
}
}