Here I gave one example of foreground service, but where reciever is in MainActivity.kt. 
In this example I want to have receiveer in separate class. So in manifest I will add:
<receiver
	android:name=".SeparateClassReceiverExample"
	android:enabled="true"
	android:exported="false">
</receiver>
Where my class SeparateClassReceiverExample looks like:
class SeparateClassReceiverExample : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent?) {
        val msg = intent?.getStringExtra("message")
    }
}
To send messages from separate foreground service I am using this code:
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
	val context = this
	when (intent?.action) {
		IntentGlobalActions.START_FOREGROUND_SERVICE -> {
		
		...
			val serviceIntent = Intent(context, SeparateClassReceiverExample::class.java)
			serviceIntent.putExtra("message", "Message number: $messageNumber")
			sendBroadcast(serviceIntent)
			
		}
notice line:
val context = this
Next problem is to update ui, this is why now my receiver will look like:
class SeparateClassReceiverExample : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent?) {
        val msg = intent?.getStringExtra("message")
        val tickIntent = Intent(IntentGlobalActions.UI_UPDATE)
        tickIntent.setPackage(context.packageName)
        tickIntent.putExtra("message", msg)
        context.sendBroadcast(tickIntent)
    }
}
In MainActivity.kt I wrote:
private val uiReceiver = object : BroadcastReceiver() {
	override fun onReceive(context: Context?, intent: Intent?) {
		val msg = intent?.getStringExtra("message")
		if (msg != null) appendLog(msg)
	}
}
and 
registerReceiver(uiReceiver, IntentFilter(IntentGlobalActions.UI_UPDATE), RECEIVER_NOT_EXPORTED)
unregisterReceiver(uiReceiver)
Example download from 
here.