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.