Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Oreo - Foreground service does not show foreground notification

So far, I've adjsuted my code to use ContextCompat.startForegroundService(context, intentService); to start my service. This way, it works on android < 26 and on android 26 (Oreo) as well.

I still see a difference, in android oreo I don't see my custom foreground notification (I only see the "app is running in the background" notification). Do I have to adjust anything there as well?

My service looks like this:

public class BaseOverlayService extends Service {     @Override     public void onCreate() {         super.onCreate();         moveToForeground();     }      private void moveToForeground() {         Notification notification = ...;         super.startForeground(NOTIFICATION_ID, notification);     } } 

Official example

This example (https://github.com/googlesamples/android-play-location/blob/master/LocationUpdatesForegroundService/app/src/main/java/com/google/android/gms/location/sample/locationupdatesforegroundservice/LocationUpdatesService.java#L200) shows as comment, that I should use following, but startServiceInForeground does not exist...

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) {     NotificationManager mNotificationManager = ((NotificationManager) getSystemService(NOTIFICATION_SERVICE));     mNotificationManager.startServiceInForeground(new Intent(this, BaseOverlayService.class), NOTIFICATION_ID, notification); } else {     startForeground(NOTIFICATION_ID, notification); } 

Edit

My notification is created like this, which is working on thousands of android devices with API < 26 until now:

protected Notification foregroundNotification(int notificationId) {     boolean paused = MainApp.getPrefs().sidebarServicePaused();     NotificationCompat.Builder builder = new NotificationCompat.Builder(this);     builder.setSmallIcon(R.drawable.icon_not);     builder.setContentIntent(notificationIntent());     builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon));     builder.setContentTitle(getString(R.string.derived_app_name));     builder.setContentText(getString(checkStatus() ? (paused ? R.string.service_notification_text_paused : R.string.service_notification_text_running) : R.string.service_notification_text_preparing));     builder.setColor(Color.parseColor("#25baa2"));      if (MainApp.getPrefs().hideNotificationIcon())         builder.setPriority(NotificationCompat.PRIORITY_MIN);     else         builder.setPriority(NotificationCompat.PRIORITY_MAX);      if (paused)         builder.addAction(R.drawable.ic_play_arrow_black_24dp, getString(R.string.resume), resumeIntent(this));     else         builder.addAction(R.drawable.ic_pause_black_24dp, getString(R.string.pause), pauseIntent(this));      return builder.build(); } 
like image 304
prom85 Avatar asked Sep 08 '17 08:09

prom85


People also ask

How do you start the foreground in Android Oreo?

The new context. startForegroundService() method starts a foreground service but with a implicit contract that service will call start foreground within 5 second of its creation. You can also call startService and startForegroundService for different OS version.

How do I update foreground notification?

To set up a notification so it can be updated, issue it with a notification ID by calling NotificationManager. notify() . To update this notification after you've issued it, update or create a NotificationCompat.

What is foreground service notification?

Foreground services show a status bar notification, so that users are actively aware that your app is performing a task in the foreground and is consuming system resources. The notification cannot be dismissed unless the service is either stopped or removed from the foreground.


1 Answers

You may need to define Notification Channel for your app. Check the log, there should be warning. Check this for introduction

I'll give you some example, it would be in kotin. First, make a class like this. You'll need to call createMainNotificationChannel() once at the start of your application.

class NotificationManager(private val context: Context) {      companion object {         private val CHANNEL_ID = "YOUR_CHANNEL_ID"         private val CHANNEL_NAME = "Your human readable notification channel name"         private val CHANNEL_DESCRIPTION = "description"     }      @RequiresApi(Build.VERSION_CODES.O)     fun getMainNotificationId(): String {         return CHANNEL_ID     }      @RequiresApi(Build.VERSION_CODES.O)     fun createMainNotificationChannel() {             val id = CHANNEL_ID             val name = CHANNEL_NAME             val description = CHANNEL_DESCRIPTION             val importance = android.app.NotificationManager.IMPORTANCE_LOW             val mChannel = NotificationChannel(id, name, importance)             mChannel.description = description             mChannel.enableLights(true)             mChannel.lightColor = Color.RED             mChannel.enableVibration(true)             val mNotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager             mNotificationManager.createNotificationChannel(mChannel)     } } 

Then you can use util like this

fun createNotificationCompatBuilder(context: Context): NotificationCompat.Builder {     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {         return NotificationCompat.Builder(context, NotificationManager(context).mainNotificationId)     } else {         return NotificationCompat.Builder(context)     } } 
like image 159
A. Shevchuk Avatar answered Oct 13 '22 09:10

A. Shevchuk