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

三星galaxy note 2 android版本4.1.2

我知道之前有人问过这个问题,不可能得到答复

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

尽管如此,昨天我更新了facebook应用程序,它开始显示未读消息的计数器私人消息。为什么facebook应用程序可以,而我不能为我的应用程序?

facebook icon

enter image description here

三星galaxy note 2 android版本4.1.2

360845 次浏览

Android(没有自定义启动器和触摸界面的“香草”Android) 允许更改应用程序图标,因为一旦程序被编译,它就被紧紧地密封在.apk中。没有办法通过使用标准api以编程方式将其更改为“可绘制”。您可以通过使用小部件而不是图标来实现您的目标。小部件是可定制的。请读这个: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的界面。其他答案使用此功能,您可以在stackoverflow上搜索此功能,例如在这里。但我要再重复一遍:对此有没有标准API,我想说这是一个实践。应用程序的图标通知徽章是一种iOS模式,它不应该用于Android应用程序。在android中,有一个状态栏通知用于这些目的:http://developer.android.com/guide/topics/ui/notifiers/notifications.html 所以,如果Facebook或其他公司使用这种方式——这不是我们应该考虑的普遍模式或趋势。但如果你坚持不使用主屏幕小部件,请看看这里:

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

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

我已经弄清楚这是如何为索尼设备。

我已经在博客上写过了。我还发布了一个关于在这里的单独SO问题。


Sony设备使用名为BadgeReciever的类。

  1. 在你的manifest文件中声明com.sonyericsson.home.permission.BROADCAST_BADGE权限: 李< / p > < / >

  2. 广播IntentBadgeReceiver:

    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. Done. Once this Intent is broadcast the launcher should show a badge on your application icon.

  4. To remove the badge again, simply send a new broadcast, this time with SHOW_MESSAGE set to false:

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

I've excluded details on how I found this to keep the answer short, but it's all available in the blog. Might be an interesting read for someone.

它工作在三星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和其他定制发射器合作。

它甚至有一种方法显示徽章计数在纯Android设备的桌面。

在应用程序图标中更新徽章计数就像调用一样简单:

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

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

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

在应用程序中添加这个类

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




}
< p > = = > 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" />