如何在应用程序启动器图标中显示通知的数量

三星Galaxy Note 2 Android版本4.1.2

我知道这个问题以前曾经问过,答复是不可能的

如何在android上的应用程序启动器图标上显示气球计数器

然而,昨天我更新了Facebook应用程序,它开始显示一个未读消息私人消息的计数器。 为什么Facebook应用程序可以和我不能这样做我的应用程序?

Facebook图标

在这里输入图像描述

三星Galaxy Note 2 Android版本4.1.2

Android(“香草”android没有自定义启动器和触摸界面)不允许更改应用程序图标,因为一旦程序被编译,它就被密封在.apk 。 没有办法使用标准API以编程方式将其更改为“drawable”。 您可以通过使用小部件而不是图标来实现您的目标。 小部件是可定制的。 请阅读: http : //www.cnet.com/8301-19736_1-10278814-251.html和这个http://developer.android.com/guide/topics/appwidgets/index.html 。 也看这里: https : //github.com/jgilfelt/android-viewbadger 。 它可以帮助你。

至于徽章号码。 正如我之前所说 – 这样做没有标准的方法。 但是我们都知道Android是一个开放的操作系统,我们可以随心所欲地做所有事情,所以添加徽章号码的唯一方法是使用一些第三方应用程序或自定义启动器,或者使用前端触摸接口:三星TouchWiz或索尼Xperia的界面。 其他答案使用这个功能,你可以在计算器上搜索这个,例如这里 。 但是我会再重复一遍:这里没有标准的API,我想说这是一个不好的做法。 应用程序的图标通知徽章是iOS模式,不应该在Android应用程序中使用。 在Andrioid中有一个状态栏通知用于这些目的: http : //developer.android.com/guide/topics/ui/notifiers/notifications.html所以,如果Facebook或其他人使用这个 – 它不是一个普通的模式或我们应该考虑的趋势。 但是,如果你坚持反对,并不想使用主屏幕小部件,那么看看这里,请:

Facebook如何在Android的应用图标上添加徽章号码?

正如你所看到的,这不是一个真正的Facebook应用程序,它是TouchWiz。 在香草android可以实现与新星启动http://forums.androidcentral.com/android-applications/199709-how-guide-global-badge-notifications.html所以,如果你会看到图标徽章的地方,确保它是无论是第三方发射器还是触摸界面(前端封装)。; Google可能会在某些时候将此功能添加到标准的Android API中。

它在三星touchwiz发射器工作

 public static void setBadge(Context context, int count) { 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); } public static String getLauncherClassName(Context context) { PackageManager pm = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); for (ResolveInfo resolveInfo : resolveInfos) { String pkgName = resolveInfo.activityInfo.applicationInfo.packageName; if (pkgName.equalsIgnoreCase(context.getPackageName())) { String className = resolveInfo.activityInfo.name; return className; } } return null; } 

ShortcutBadger是一个库,增加了设备品牌和当前启动器的抽象层,并提供了一个很好的结果。 适用于LG,索尼,三星,HTC和其他定制的发射器。

它甚至可以在Pure Android设备桌面显示徽章计数。

更新应用程序图标中的徽章计数与调用一样简单:

 int badgeCount = 1; ShortcutBadger.applyCount(context, badgeCount); 

它包含一个演示应用程序,允许您测试其行为。

我已经想出了这是如何做索尼设备。

我在这里博客了。 我也在这里发布了一个单独的SO问题。


索尼设备使用一个名为BadgeReciever的类。

  1. 声明清单文件中的com.sonyericsson.home.permission.BROADCAST_BADGE权限:

  2. BadgeReceiver广播一个Intent

     Intent intent = new Intent(); intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.yourdomain.yourapp.MainActivity"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true); intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "99"); intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", "com.yourdomain.yourapp"); sendBroadcast(intent); 
  3. 完成。 一旦这个Intent被广播发射器应该在你的应用程序图标上显示一个徽章。

  4. 要再次移除徽章,只需发送一个新的广播,这次SHOW_MESSAGE设置为false:

     intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false); 

我已经排除了我如何找到这个答案的细节,但这一切都可以在博客中找到。 可能是一个有趣的阅读某人。

这是在通知启动器图标上显示徽章的示例和最佳方式。

在你的应用程序中添加这个类

 public class BadgeUtils { public static void setBadge(Context context, int count) { setBadgeSamsung(context, count); setBadgeSony(context, count); } public static void clearBadge(Context context) { setBadgeSamsung(context, 0); clearBadgeSony(context); } private static void setBadgeSamsung(Context context, int count) { 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); } private static void setBadgeSony(Context context, int count) { String launcherClassName = getLauncherClassName(context); if (launcherClassName == null) { return; } Intent intent = new Intent(); 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.SHOW_MESSAGE", true); intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count)); intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName()); context.sendBroadcast(intent); } private static void clearBadgeSony(Context context) { String launcherClassName = getLauncherClassName(context); if (launcherClassName == null) { return; } Intent intent = new Intent(); 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.SHOW_MESSAGE", false); intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(0)); intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName()); context.sendBroadcast(intent); } private static String getLauncherClassName(Context context) { PackageManager pm = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0); for (ResolveInfo resolveInfo : resolveInfos) { String pkgName = resolveInfo.activityInfo.applicationInfo.packageName; if (pkgName.equalsIgnoreCase(context.getPackageName())) { String className = resolveInfo.activityInfo.name; return className; } } return null; } } 

==> MyGcmListenerService.java当通知来临时使用BadgeUtils类。

 public class MyGcmListenerService extends GcmListenerService { private static final String TAG = "MyGcmListenerService"; @Override public void onMessageReceived(String from, Bundle data) { String message = data.getString("Msg"); String Type = data.getString("Type"); Intent intent = new Intent(this, SplashActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.BigTextStyle bigTextStyle= new NotificationCompat.BigTextStyle(); bigTextStyle .setBigContentTitle(getString(R.string.app_name)) .bigText(message); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(getNotificationIcon()) .setContentTitle(getString(R.string.app_name)) .setContentText(message) .setStyle(bigTextStyle) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); int color = getResources().getColor(R.color.appColor); notificationBuilder.setColor(color); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); int unOpenCount=AppUtill.getPreferenceInt("NOTICOUNT",this); unOpenCount=unOpenCount+1; AppUtill.savePreferenceLong("NOTICOUNT",unOpenCount,this); notificationManager.notify(unOpenCount /* ID of notification */, notificationBuilder.build()); // This is for bladge on home icon BadgeUtils.setBadge(MyGcmListenerService.this,(int)unOpenCount); } private int getNotificationIcon() { boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP); return useWhiteIcon ? R.drawable.notification_small_icon : R.drawable.icon_launcher; } } 

并清楚通知偏好,并与徽章计数

  public class SplashActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); AppUtill.savePreferenceLong("NOTICOUNT",0,this); BadgeUtils.clearBadge(this); } } 
 <uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />