BroadcastReceiver не получает локальную трансляцию - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь расширить службу FCM и транслировать на MainActivity при вызове onNewToken(). onNewToken() действительно вызывается, а метод onReceive() - нет. Насколько я знаю, мне не нужно определять что-либо еще в манифесте, так как это локальная трансляция. Это мои занятия:

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))
    }
}

1 Ответ

0 голосов
/ 31 октября 2018

Трансляции, отправленные с помощью Context.sendBroadcast(), не являются локальными трансляциями, поэтому вы их не получаете.

Вам также необходимо использовать LocalBroadcastManager для отправки.

Вместо следующего:

applicationContext.sendBroadcast(Intent(TOKEN_REFRESHED_EVENT))

Вы должны сделать что-то вроде этого:

LocalBroadcastManager.getInstance(this)
        .sendBroadcast(Intent(TOKEN_REFRESHED_EVENT))

Кроме того, не забудьте отменить регистрацию приемника, когда это необходимо, чтобы избежать утечек памяти:

// most likely in onDestroy() (since the registration is in onCreate())
LocalBroadcastManager.getInstance(this)
        .unregisterReceiver(broadcastReceiver)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...