Cookienator
Cookienator

Reputation: 647

BroadcastReceiver is not receiving local broadcast

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

Answers (1)

earthw0rmjim
earthw0rmjim

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

Related Questions