我正在实现FCM通知,我有一个来自后端的通知,它不包含任何数据,只有一个标题。这意味着如果我的应用程序在收到此通知时未运行,并且用户打开了此通知,则我的应用将在启动时附带null额外内容和数据。
有没有一种方法可以区分这种";空通知";从正常"发射";用户点击应用程序图标";启动应用程序,以便我可以将用户带到";"通知";部分的应用程序?
这两种情况都有空数据和附加数据。
在创建启动应用程序的Intent时,您需要使用putExtra(ID_KEY,id)
,在onCreate()
方法中,您可以使用getIntent().getExtras().getInt(ID_KEY)
来检索传递的id。
可以。您可以为每个Intent
指定其action
。像这样:
private fun sendNotification(title: String, message: String) {
// Firstly, you create an intent that will open an activity when user taps on your notification.
val intent = Intent(this, ProfileScreenActivity::class.java)
.putExtra(INTENT_EXTRA_FIREBASE_MESSAGE_TITLE, title) // Add Title
.putExtra(INTENT_EXTRA_FIREBASE_MESSAGE_BODY, message) // Add Message
// Optional, but it basically clears backstack and all hierarchy of open Fragments/Activities
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
// Here is where we specify that this Intent comes from Firebase Service
intent.action = INTENT_ACTION_FIREBASE_MESSAGE_DIALOG
// Wrap all of this
val pendingIntent = PendingIntent.getActivity(
this,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
// Standard code for creating and sending Notifications.
val channelId = getString(R.string.firebase_default_notification_channel_id)
val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val notificationBuilder = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_notification_icon)
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setPriority(NotificationCompat.PRIORITY_MAX)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(channelId, DEFAULT_NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH)
notificationManager.createNotificationChannel(channel)
}
notificationManager.notify(Random.nextInt(0, 100), notificationBuilder.build())
}
然后,在用户点击通知时打开的"活动"中,执行以下操作:
// Check if any actions were passed to this Activity when it's started.
// If any actions were passed, we check what action was passed and proceed from there.
intent.action?.let { action ->
if (action == INTENT_ACTION_FIREBASE_MESSAGE_DIALOG) {
intent.extras?.let { extras ->
alertDialog.warning(this, extras.getString(INTENT_EXTRA_FIREBASE_MESSAGE_BODY), extras.getString(INTENT_EXTRA_FIREBASE_MESSAGE_TITLE))
}
}
if (action == INTENT_ACTION_INTERNET_DAYS_LEFT_DIALOG) {
intent.extras?.let { extras ->
alertDialog.warning(this, extras.getString(INTENT_EXTRA_INTERNET_DAYS_LEFT))
}
}
}
事实证明,Android将整个通知捆绑包提供给应用程序的启动意向附加。我们的应用程序有一些代码,用于检查这些附加项中是否存在特定的密钥,否则就会丢弃它们。通过这种方式,我们可以使用类似于Priyaank和Rey建议的方法,在意向中检查/添加一个动作,或在附加中添加一个键/值对,以区分应用程序的通知启动和图标启动。
对这个话题有一个常见的误解。您需要记住,如果应用程序在后台或被终止,FirebaseMessagingService的onMessageReceived
方法将不会被调用。一旦用户点击通知,Android将向启动意向(附加(发送通知。