繁体   English   中英

android - 在前台点击通知没有响应 Firebase 云消息传递

[英]android - Tapping notifications in the foreground does not respond with Firebase Cloud Messaging

我正在使用Firebase Cloud Messaging在 android 应用程序中实现通知。 我是 android 的新手。 请帮我。

问题

当我在前台收到通知 state 时,出现了意外的移动。

  • 预期:在收到通知时什么都不做。 我想在点击通知时处理它。
  • 实际:BroadcastReceiver 的 onReceive 在收到通知的时机调用。 当我点击它时它没有响应( "test onCreate"未显示在 logcat 中)。

注意:本应用完全由 MainActivity 上的一个 Fragment 操作。

文件

PushNotificationListenerService.kt

class PushNotificationListenerService: FirebaseMessagingService() {
    override fun onMessageReceived(message: RemoteMessage) {
        super.onMessageReceived(message)
        
        val channelId = message.notification?.channelId.toString()
        val title: String = message.notification?.title.toString()
        val text: String = message.notification?.body.toString()

        sendNotification(
            title,
            text,
            channelId
        )

        var broadcast = Intent()
        broadcast.action = "FCM_RECEIVE_FOREGROUND"

        sendBroadcast(broadcast)
    }

    private fun sendNotification(
        title: String,
        text: String,
        receivedChannelId: String,
    ) {
        val intent = Intent(this, HomeFragment::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

        val pendingIntent =
            PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)
                .apply {
                    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
                }

        val notificationBuilder = NotificationCompat.Builder(this, receivedChannelId)
            .setContentTitle(title)
            .setContentText(text)
            .setSmallIcon(R.drawable.ic_menu_logo)
            .setContentIntent(pendingIntent)
            .setPriority(PRIORITY_MAX)
            .setCategory(CATEGORY_CALL)
            .setAutoCancel(true)
            .setSound(null)
            .setVibrate(null)

        val notificationManager: NotificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        val uuid = UUID.randomUUID().hashCode()
        notificationManager.notify(uuid, notificationBuilder.build())

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            notificationBuilder.setChannelId(receivedChannelId)
        }
    }
}

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var navController: NavController
    private var mReceiver: BroadcastReceiver? = null
    private val mIntentFilter = IntentFilter("FCM_RECEIVE_FOREGROUND")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Timber.d("test onCreate")

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.lifecycleOwner = this

        mReceiver = (object: BroadcastReceiver() {
            override fun onReceive(p0: Context?, p1: Intent?) {
                Timber.d("test onReceive called")
                if (p1 == null) { return }
            }
        })

        setupChannels()
    }

    override fun onResume() {
        super.onResume()
        registerReceiver(mReceiver, mIntentFilter)
    }

    override fun onPause() {
        if (mReceiver != null) {
            unregisterReceiver(mReceiver)
            mReceiver = null
        }
        super.onPause()
    }

    private fun setupChannels() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val attribute = AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .build()
            var uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
            
            val channel = NotificationChannel(
                "channelId",
                "channelName",
                NotificationManager.IMPORTANCE_HIGH
            ).apply {
                vibrationPattern = createVibrate()
                lightColor = Color.BLUE
                lockscreenVisibility = Notification.VISIBILITY_PUBLIC
                setSound(uri, attribute)
            }
            
            manager.createNotificationChannel(channel)
        }
    }
}

来自 Firebase 云消息传递的通知的有效负载

const fcmTokenMessage: admin.messaging.TokenMessage = {
  android: {
    data: {},
    notification: {
      body: "message",
      title: "title",
      defaultSound: true,
      channelId: "channelId",
      sound: 'default',
      priority: 'high',
      notificationCount: fcmPushData.notificationCount
    }
  },
  token: fcmPushData.fcmPushToken
};

版本

build.gradle

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32"
        classpath "org.jetbrains.kotlin:kotlin-serialization:1.4.32"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5"
        classpath 'com.google.gms:google-services:4.3.8'

        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

就这样。 对于给您带来的不便,我深表歉意,并感谢您的合作。

解决。 问题是 Fragment 被指定为 Intent,当指定 Activity 时,它就起作用了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM