I have an app that has two services.
One is for showing UI for floating (overlay) on other apps using WindowManager
. The other is for Location Tracking using GooglePlayAPI
. My app always runs these services.
I want these services not to be killed by the OS. So I call Service.startForeground()
. However there are two notifications in the notification drawer.
Is there a way to use a single notification for both services?
Yes, it is possible.
If we take a look at Service.startForeground() signature, it accept both notification id & the notification itself (see documentation). Hence, if we want to have an only single notification for more than one foreground services, these services must share the same notification & notification id.
We can use the singleton pattern to get the same notification & notification id. Here is the example implementation:
NotificationCreator.java
public class NotificationCreator { private static final int NOTIFICATION_ID = 1094; private static final String CHANNEL_ID = "Foreground Service Channel"; private static Notification notification; public static Notification getNotification(Context context) { if(notification == null) { notification = new NotificationCompat.Builder(context, CHANNEL_ID) .setContentTitle("Try Foreground Service") .setContentText("Yuhu..., I'm trying foreground service") .setSmallIcon(R.mipmap.ic_launcher) .build(); } return notification; } public static int getNotificationId() { return NOTIFICATION_ID; } }
Thus, we can use this class in our foreground services. For example, we have MyFirstService.java & MySecondService.java:
MyFirstService.java
public class MyFirstService extends Service { @Override public void onCreate() { super.onCreate(); startForeground(NotificationCreator.getNotificationId(), NotificationCreator.getNotification(this)); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
MySecondService.java
public class MySecondService extends Service { @Override public void onCreate() { super.onCreate(); startForeground(NotificationCreator.getNotificationId(), NotificationCreator.getNotification(this)); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
Just try to run these services. Voila! You have a single notification for multiple foreground services ;)!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With