How to show an app badge in Oreo, when app is closed (not running at all)?

Raj Kumar Singh
        public class GcmBroadcastReceiver extends BroadcastReceiver
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {// Control comes here when any new notification is received
                 final Notification notification = getNotification(threadId, jobTitle, body, subTitle, title, imageURL);
                EventLoggerService.showAppBadge(context, notification, new EventLoggerService.EventLoggerServiceStartedListner(){
                    @Override
                    public void eventLoggerServiceStarted() {
                        notificationManager.notify(101, notification);
                    }
                });
            }

            public Notification getNotification(final String threadId, String jobTitle, final String body ,String subTitle, String title, final String imageURL)
               {
                    final Context context = CareSDKApplication.singleton().getApplicationContext();
                    mThreadId = threadId;
                    mImageURL = imageURL;
                    mBody = body;
                    mTitle = title;
                    mSubTitle = subTitle;

                    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationsUtils.NOTIFICATION_CHANNEL_ID)
                        // .setLargeIcon(largeIcon)
                        .setSmallIcon(R.drawable.message_notification)
                        .setAutoCancel(true)
                        .setContentIntent(getContentIntent(threadId))
                        .setTicker(getTicker(threadId));

                    RemoteViews customNotification = new RemoteViews(context.getPackageName(), R.layout.image_notification_custom_view);
                    builder.setCustomContentView(customNotification);
                    if (!TextUtils.isEmpty(title)) 
                {
                        customNotification.setTextViewText(R.id.title, StringEscapeUtils.unescapeJava(title));
                            customNotification.setTextViewText(R.id.sub_title,  StringEscapeUtils.unescapeJava(subTitle));
                        customNotification.setTextViewText(R.id.content, StringEscapeUtils.unescapeJava(body));
                    }
                    else
                   {
                        customNotification.setTextViewText(R.id.title, "");
                        customNotification.setTextViewText(R.id.sub_title,  StringEscapeUtils.unescapeJava(body));
                        customNotification.setTextViewText(R.id.content, "");
                }
                customNotification.setTextViewText(R.id.time, new SimpleDateFormat("HH:mm").format(new Date()));
                customNotification.setTextViewText(R.id.number_of_notifications, getUnreadCount(threadId) + "");
                //builder.setPriority(Notification.PRIORITY_MAX);


                mBuilder = builder;

                // For versions equal and higher than jelly bean
                if (Build.VERSION.SDK_INT >= 16) {
                    builder.setStyle(getStyle(threadId));
                }

                if (!TextUtils.isEmpty(imageURL)) {
                    mBigPicture = Utils.getImage(context, imageURL, this);

                    if (mBigPicture != null) {
                        setImageNotification(builder, context, threadId, body, title, subTitle);
                    }
                }
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    builder.setColor(0x00bce4);
                }
                Notification notification = builder.build();

                return notification;
            }
        }


        public class EventLoggerService extends IntentService
        {
            private static EventLoggerServiceStartedListner 
            mEventLoggerServiceStartedListner;
            private static Notification mNotification;

            @Override
            public void onCreate()
            {
                super.onCreate();
                // This is required for Android O
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
                {
                    android.os.Debug.waitForDebugger();
                    NotificationsUtils notificationsUtils = new NotificationsUtils(this);
                    startForeground(1, mNotification);
                    Log.d("EventLoggerService", "EventLoggerService Created");
                }
            }

            public interface EventLoggerServiceStartedListner{
                public void eventLoggerServiceStarted();
            }
            @Override
            public void onStart(@Nullable Intent intent, int startId) {
                super.onStart(intent, startId);
                Log.d("EventLoggerService", "EventLoggerService Started");
            }

            @Override
            public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
                super.onStartCommand(intent, flags, startId);
                Log.d("EventLoggerService", "EventLoggerService onStartCommand");
                mEventLoggerServiceStartedListner.eventLoggerServiceStarted();
                return START_STICKY;
            }

            public static void showAppBadge(Context context, Notification notification, EventLoggerServiceStartedListner eventLoggerServiceStartedListner)
            {
                android.os.Debug.waitForDebugger();
                mNotification = notification;
                mEventLoggerServiceStartedListner = eventLoggerServiceStartedListner;
                Intent service = new Intent(context, EventLoggerService.class);
                context.startForegroundService(service);
            }

        }



        public class NotificationsUtils extends ContextWrapper{
            public static final String NOTIFICATION_CHANNEL_ID = "Care_push_note";
            public static final String NOTIFICATION_CHANNEL_NAME = "Care.com";

            Context mContext;
            NotificationManager mNotificationManager;
            public NotificationsUtils(Context context) {
                super(context);
                mContext = context;
                createChannels();
            }

            public void createChannels()
            {
    // Notification Channel is created for same channel id as Notification is created in side getNotification method of GcmBroadcastReceiver 
                NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
                channel.setShowBadge(true);
                channel.enableLights(true);
                channel.enableVibration(true);
                channel.setLightColor(Color.GREEN);
                channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
                getManager().createNotificationChannel(channel);
            }

            public NotificationManager getManager() {
                if (mNotificationManager == null) {
                    mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                }
                return mNotificationManager;
            }
        }

All method calls are executing as expected, geting Notification in Notification bar but Appbadge is not shown in Android O devices, when app is closed. Please tell me what is the mistake I am doing?

If I put Channel creation code and Notification code in side click event of some view then it works fine, when app is open.

Demigod

In Android notification badges doesn't work as they are in iOS. They just showing that the app has some notifications that are in the status bar. When notification is removed from status bar, than badge will also disappear.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Related Related

HotTag

Archive