1.
I am using:
override fun updateNotification(mediaSession: MediaSessionCompat) {
    if (!PlayerService.IS_RUNNING) return
    GlobalScope.launch {
        notificationManager.notify(NOTIFICATION_ID, buildNotification(mediaSession))
    }
}
I could use:
 override fun updateNotification(mediaSession: MediaSessionCompat) {
    if (!BeatPlayerService.IS_RUNNING) return
    CoroutineScope(Dispatchers.IO).launch {
        notificationManager.notify(NOTIFICATION_ID, buildNotification(mediaSession))
    }
}
2.
I am using:
GlobalScope.launch {
  while (true) {
  delay(100)
  mediaMediaConnection.mediaController ?: continue
  val newTime = mediaMediaConnection.mediaController?.playbackState?.position
  if (state == BIND_STATE_BOUND) newTime?.toInt()?.let { update(it) }
  if (state == BIND_STATE_CANCELED) break
     }
  }
I could use:
 CoroutineScope(Dispatchers.IO).launch {
        while (true) {
            delay(100)
            mediaMediaConnection.mediaController ?: continue
            val newTime = mediaMediaConnection.mediaController?.playbackState?.position
            if (state == BIND_STATE_BOUND) newTime?.toInt()?.let { update(it) }
            if (state == BIND_STATE_CANCELED) break
        }
    }
I dont see any visible difference while using GlobalScope.launch versus CoroutineScope().launch in my music app.
Can someone explain which is better to use in my context of 1 and 2
I have seen:
Why not use GlobalScope.launch?
but don't quite understand fully especially in my use case.