Show Badge count on App icon in Android

2019-01-27 10:53发布

In my Android app,i want to show a push-notification badge count into application icon like ios.

How can I show badge count into application icon ?

2条回答
forever°为你锁心
2楼-- · 2019-01-27 11:08

1. use ShortcutBadger library for badges count

        dependencies {
            compile 'me.leolin:ShortcutBadger:1.1.4@aar'
        }

2.

       public class MyFirebaseMessagingService extends FirebaseMessagingService {

            private static final String TAG = "MyFirebaseMsgService";

            Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

            @Override
            public void onMessageReceived(RemoteMessage remoteMessage) {

                // Check if message contains a data payload.
                if (remoteMessage.getData().size() > 0) {
                    Log.d(TAG, "1. remoteMessage.getData().size() > 0");
                    Log.d(TAG, "Message data payload: " + remoteMessage.getData()); // {mobile=9458074124, name=Arvind}
                    Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
                    Log.d(TAG, "Message getTitle: " + remoteMessage.getNotification().getTitle());
                    Map<String, String> notificationData1 = remoteMessage.getData();

                    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());

                    Log.d(TAG, sharedPreferences.getString("userid", "") + ".....id"+notificationData1.get("action"));

                    try {

                        if (notificationData1.get("actionID").equalsIgnoreCase(sharedPreferences.getString("userid", ""))) {

                        } else {
                            showNotificationForEvent(remoteMessage);
                            // }

                        }


                    }catch (Exception e)
                    {
                        e.printStackTrace();
                    }

                }

            }

            // Show Notification for Attend,Like,Comment,Rate

            private void showNotificationForEvent(RemoteMessage remoteMessage) {

                Log.d(TAG, "00. showNotificationForEvent");

                Map<String,String> notificationData = remoteMessage.getData();

                Intent resultIntent = new Intent(this, BubblesActivity.class);
                resultIntent.putExtra("action", notificationData.get("action"));
                resultIntent.putExtra("actionID", notificationData.get("actionID"));

                resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, resultIntent,
                        PendingIntent.FLAG_ONE_SHOT);

                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                        .setSmallIcon(R.drawable.ipray_appicon)
        //                .setColor(ContextCompat.getColor(this, R.color.textColor))
                        .setContentTitle(remoteMessage.getNotification().getTitle())
                        .setContentText(remoteMessage.getNotification().getBody()/*+Utils.getPrefrence(getApplicationContext(), Const.KEY_USER_ID)+"...id"*/)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setContentIntent(pendingIntent);


                //Vibration   // new long[] { 1000, 1000, 1000, 1000, 1000 }
                notificationBuilder.setVibrate(new long[]  {500,1000});

                NotificationManager notificationManager =
                        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

                notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
            }




            //This method will return true if the app is in background.
            private boolean isAppIsInBackground(Context context) {
                boolean isInBackground = true;
                ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD) {
                    List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
                    for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
                        if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                            for (String activeProcess : processInfo.pkgList) {
                                if (activeProcess.equals(context.getPackageName())) {
                                    isInBackground = false;
                                }
                            }
                        }
                    }

                }

                else {
                    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
                    ComponentName componentInfo = taskInfo.get(0).topActivity;
                    if (componentInfo.getPackageName().equals(context.getPackageName())) {
                        isInBackground = false;
                    }
                }

                return isInBackground;
            }


            @Override
            protected Intent zzae(Intent intent) {

                //Log.e("intentdata","DataPayload zzae"+intentToString(intent));

                return super.zzae(intent);
            }

            @Override
            public boolean zzag(Intent intent) {

                Log.e("intentdata","DataPayload zzag==="+intentToString(intent).toString());
                Log.e("intentdata","getData====="+intent.toString());

               if( intent.hasExtra("totalprayerdue"))
                {
                    ShortcutBadger.applyCount(getApplicationContext(), Integer.parseInt(intent.getStringExtra("totalprayerdue")));
                }

                return super.zzag(intent);
            }

            @Override
            public void zzm(Intent intent) {
                Log.e("intentdata","DataPayload zzm"+intentToString(intent));
                super.zzm(intent);
            }

            public static String intentToString(Intent intent) {
                if (intent == null)
                    return "";

                StringBuilder stringBuilder = new StringBuilder("action: ")
                        .append(intent.getAction())
                        .append(" data: ")
                        .append(intent.getDataString())
                        .append(" extras: ")
                        ;
                for (String key : intent.getExtras().keySet())
                    stringBuilder.append(key).append("=").append(intent.getExtras().get(key)).append(" ");

                return stringBuilder.toString();

            }
        }
查看更多
beautiful°
3楼-- · 2019-01-27 11:27

Android doesn't have this particular feature.

An alternative might be to have a notification that displays the number but the app icon itself is incapable under normal circumstances.

If you REALLY wanted to break design guidelines you could make a widget that looks like your app icon and the widget gets much more control over how it's drawn. Some apps have been released to do this for Gmail, Google Voice, the standard Messaging app, and missed called for the Phone app and they masquerade as regular app icons so it is possible. I don't really recommend this approach, but it is available.

查看更多
登录 后发表回答