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
Post a Comment