Android Foreground Service Notification Not Showing


Answer :

It's because of Android O bg services restrictions.

So now you need to call startForeground() only for services that were started with startForegroundService() and call it in first 5 seconds after service has been started.

Here is the guide - https://developer.android.com/about/versions/oreo/background#services

Like this:

//Start service: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {   startForegroundService(new Intent(this, YourService.class)); } else {   startService(new Intent(this, YourService.class)); } 

Then create and show notification (with channel as supposed earlier):

private void createAndShowForegroundNotification(Service yourService, int notificationId) {      final NotificationCompat.Builder builder = getNotificationBuilder(yourService,          "com.example.your_app.notification.CHANNEL_ID_FOREGROUND", // Channel id     NotificationManagerCompat.IMPORTANCE_LOW); //Low importance prevent visual appearance for this notification channel on top      builder.setOngoing(true)     .setSmallIcon(R.drawable.small_icon)     .setContentTitle(yourService.getString(R.string.title))     .setContentText(yourService.getString(R.string.content));      Notification notification = builder.build();      yourService.startForeground(notificationId, notification);      if (notificationId != lastShownNotificationId) {           // Cancel previous notification           final NotificationManager nm = (NotificationManager) yourService.getSystemService(Activity.NOTIFICATION_SERVICE);           nm.cancel(lastShownNotificationId);     }     lastShownNotificationId = notificationId; }  public static NotificationCompat.Builder getNotificationBuilder(Context context, String channelId, int importance) {     NotificationCompat.Builder builder;     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {         prepareChannel(context, channelId, importance);         builder = new NotificationCompat.Builder(context, channelId);     } else {         builder = new NotificationCompat.Builder(context);     }     return builder; }  @TargetApi(26) private static void prepareChannel(Context context, String id, int importance) {     final String appName = context.getString(R.string.app_name);     String description = context.getString(R.string.notifications_channel_description);     final NotificationManager nm = (NotificationManager) context.getSystemService(Activity.NOTIFICATION_SERVICE);      if(nm != null) {         NotificationChannel nChannel = nm.getNotificationChannel(id);          if (nChannel == null) {             nChannel = new NotificationChannel(id, appName, importance);             nChannel.setDescription(description);             nm.createNotificationChannel(nChannel);         }     } } 

Remember that your foreground notification will have the same state as your other notifications even if you'll use different channel ids, so it might be hidden as a group with others. Use different groups to avoid it.


The problem was i am using Android O and it requires more information. Here is the successful code for android O.

    mNotifyManager = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE);     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) createChannel(mNotifyManager);     mBuilder = new NotificationCompat.Builder(mActivity, "YOUR_TEXT_HERE").setSmallIcon(android.R.drawable.stat_sys_download).setColor             (ContextCompat.getColor(mActivity, R.color.colorNotification)).setContentTitle(YOUR_TITLE_HERE).setContentText(YOUR_DESCRIPTION_HERE);     mNotifyManager.notify(mFile.getId().hashCode(), mBuilder.build());  @TargetApi(26) private void createChannel(NotificationManager notificationManager) {     String name = "FileDownload";     String description = "Notifications for download status";     int importance = NotificationManager.IMPORTANCE_DEFAULT;      NotificationChannel mChannel = new NotificationChannel(name, name, importance);     mChannel.setDescription(description);     mChannel.enableLights(true);     mChannel.setLightColor(Color.BLUE);     notificationManager.createNotificationChannel(mChannel); } 

If none of the above worked you should check if your notification id is 0 ... SURPRISE!! it cannot be 0.

Many thanks to @Luka Kama for this post

startForeground(0, notification); // Doesn't work...  startForeground(1, notification); // Works!!! 

Comments

Popular posts from this blog

Chemistry - Bond Angles In NH3 And NCl3

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?