Android - Implementing StartForeground For A Service?


Answer :

I'd start by completely filling in the Notification. Here is a sample project demonstrating the use of startForeground().


From your main activity, start the service with the following code:

Intent i = new Intent(context, MyService.class);  context.startService(i); 

Then in your service for onCreate() you would build your notification and set it as foreground like so:

Intent notificationIntent = new Intent(this, MainActivity.class);  PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,                 notificationIntent, 0);  Notification notification = new NotificationCompat.Builder(this)                 .setSmallIcon(R.mipmap.app_icon)                 .setContentTitle("My Awesome App")                 .setContentText("Doing some work...")                 .setContentIntent(pendingIntent).build();  startForeground(1337, notification); 

Solution for Oreo 8.1

I've encountered some problems such as RemoteServiceException because of invalid channel id with most recent versions of Android. This is how i solved it:

Activity:

override fun onCreate(savedInstanceState: Bundle?) {     val intent = Intent(this, BackgroundService::class.java)      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {         startForegroundService(intent)     } else {         startService(intent)     } } 

BackgroundService:

override fun onCreate() {     super.onCreate()     startForeground() }  private fun startForeground() {      val service = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager     val channelId =             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {                 createNotificationChannel()             } else {                 // If earlier version channel ID is not used                 // https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)                 ""             }      val notificationBuilder = NotificationCompat.Builder(this, channelId )     val notification = notificationBuilder.setOngoing(true)             .setSmallIcon(R.mipmap.ic_launcher)             .setPriority(PRIORITY_MIN)             .setCategory(Notification.CATEGORY_SERVICE)             .build()     startForeground(101, notification) }   @RequiresApi(Build.VERSION_CODES.O) private fun createNotificationChannel(): String{     val channelId = "my_service"     val channelName = "My Background Service"     val chan = NotificationChannel(channelId,             channelName, NotificationManager.IMPORTANCE_HIGH)     chan.lightColor = Color.BLUE     chan.importance = NotificationManager.IMPORTANCE_NONE     chan.lockscreenVisibility = Notification.VISIBILITY_PRIVATE     val service = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager     service.createNotificationChannel(chan)     return channelId } 

JAVA EQUIVALENT

public class YourService extends Service {      // Constants     private static final int ID_SERVICE = 101;      @Override     public int onStartCommand(Intent intent, int flags, int startId) {         super.onStartCommand(intent, flags, startId);         return START_STICKY;     }      @Override     public void onCreate() {         super.onCreate();          // do stuff like register for BroadcastReceiver, etc.          // Create the Foreground Service         NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);         String channelId = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? createNotificationChannel(notificationManager) : "";         NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, channelId);         Notification notification = notificationBuilder.setOngoing(true)                 .setSmallIcon(R.mipmap.ic_launcher)                 .setPriority(PRIORITY_MIN)                 .setCategory(NotificationCompat.CATEGORY_SERVICE)                 .build();          startForeground(ID_SERVICE, notification);     }      @RequiresApi(Build.VERSION_CODES.O)     private String createNotificationChannel(NotificationManager notificationManager){         String channelId = "my_service_channelid";         String channelName = "My Foreground Service";         NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH);         // omitted the LED color         channel.setImportance(NotificationManager.IMPORTANCE_NONE);         channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);         notificationManager.createNotificationChannel(channel);         return channelId;     } } 

Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?