Reputation: 647
I'm trying to extend the FCM service, and broadcast to the MainActivity
upon onNewToken()
being called. onNewToken()
is indeed called, but the onReceive()
method is not. As far as I know, I do not need to define anything else in the manifest, since this is a local broadcast. These are my classes:
MainActivity.kt
package com.reali.app.mymessagingapp
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.content.LocalBroadcastManager
import android.widget.TextView
import com.google.android.gms.tasks.OnCompleteListener
import com.reali.app.mymessagingapp.MyFirebaseMessagingService.Companion.TOKEN_REFRESHED_EVENT
import com.google.firebase.iid.FirebaseInstanceId
import com.google.firebase.iid.InstanceIdResult
class MainActivity : AppCompatActivity() {
private lateinit var broadcastReceiver: BroadcastReceiver
private lateinit var tvTitle: TextView
private lateinit var tvToken: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tvTitle = findViewById(R.id.tvTitle)
tvToken = findViewById(R.id.tvToken)
broadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
tvTitle.text = resources.getString(R.string.token_refreshed)
refreshTokenText()
}
}
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(TOKEN_REFRESHED_EVENT))
refreshTokenText()
}
private fun refreshTokenText() {
FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener(OnCompleteListener<InstanceIdResult> { task ->
if (!task.isSuccessful) {
return@OnCompleteListener
}
val token = task.result?.token
tvToken.text = token
})
}
}
MyFirebaseMessagingService.kt
package com.reali.app.mymessagingapp
import android.content.Intent
import android.util.Log
import com.google.firebase.messaging.FirebaseMessagingService
class MyFirebaseMessagingService : FirebaseMessagingService()
{
companion object {
const val TOKEN_REFRESHED_EVENT = "token_refreshed_event"
}
override fun onNewToken(token: String?) {
Log.d("MyFcmMessagingService", "Refreshed token: " + token!!)
applicationContext.sendBroadcast(Intent(TOKEN_REFRESHED_EVENT))
}
}
Upvotes: 1
Views: 2936
Reputation: 19417
Broadcasts sent via Context.sendBroadcast()
are not local broadcasts, that's why you're not receiving them.
You need to use LocalBroadcastManager
for the sending as well.
Instead of the following:
applicationContext.sendBroadcast(Intent(TOKEN_REFRESHED_EVENT))
You should do something like this:
LocalBroadcastManager.getInstance(this)
.sendBroadcast(Intent(TOKEN_REFRESHED_EVENT))
Also, do not forget to unregister your receiver when appropriate to avoid memory leaks:
// most likely in onDestroy() (since the registration is in onCreate())
LocalBroadcastManager.getInstance(this)
.unregisterReceiver(broadcastReceiver)
Upvotes: 5