Zor*_*gan -4 android kotlin firebase firebase-cloud-messaging
我有一个 SharedPreference: sharedPref.getBoolean("online", false)
如果我收到一条online错误通知,我想阻止它。如果用户离线,通常不会有通知,但我偶尔会收到通知,我希望将其作为备份以防止通知。
通知通过Firebase Cloud Messaging (FCM) 发送,以下是它在我的应用程序中的处理方式:
class CustomApplication : Application() {
val MATCH_CHANNEL_ID = "MATCH_CHANNEL"
companion object {
var database: AppDatabase? = null
}
override fun onCreate() {
super.onCreate()
val settings: FirebaseFirestoreSettings = FirebaseFirestoreSettings.Builder().setPersistenceEnabled(false).build()
FirebaseFirestore.getInstance().firestoreSettings = settings
CustomApplication.database = Room.databaseBuilder(this, AppDatabase::class.java, "AppDatabase").build()
createNotificationChannel()
}
private fun createNotificationChannel(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
val matchChannel = NotificationChannel(MATCH_CHANNEL_ID, "Nearby matches", NotificationManager.IMPORTANCE_HIGH)
matchChannel.description = "Nearby matches"
val manager: NotificationManager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(matchChannel)
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果onlineSharedPreferences 中的值为 false,有什么方法可以阻止通知传入?
编辑:
当我在后台收到通知 FCM 时,它会调用 . FirebaseMessagingService.onCreate():
class CustomFirebaseMessagingService : FirebaseMessagingService() {
val db = FirebaseFirestore.getInstance()
override fun onCreate() {
Log.d(TAG, "CustomFirebaseMessagingService onCreate()")
return
super.onCreate()
}
Run Code Online (Sandbox Code Playgroud)
我之前已经覆盖onCreate()返回super.onCreate()- 希望取消通知。但是,通知仍然会触发。
CustomFirebaseMessagingService()我可以覆盖另一个功能来拦截通知并取消它吗?
如果我正确理解了您的问题,那么您正在谈论当您的应用程序未运行时接收推送消息的情况。您已经提到onMessageReceived()只有在您的应用程序处于运行状态时才会被调用,但是即使系统没有调用此方法,您的通知也会显示。因此,我们可以得出结论,这些通知是由系统自动绘制的。此行为由 FCM 消息正文中的“通知”和“数据”部分控制。
FCM 消息具有复杂的规范,可在此处找到。但由于我们只对“通知”和“数据”部分感兴趣,我们可以依赖它们的行为:
第一种情况 - “通知”和“数据”部分都存在
例子:
{
"message":{
"notification": { /*...*/ },
"data": {/*...*/}
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果您的应用处于后台状态,
第二种情况 - 仅存在“通知”部分
例子:
{
"message":{
"notification": { /*...*/ },
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果您的应用处于后台状态,
第三种情况 - 仅存在“数据”部分
例子:
{
"message":{
"data": {/*...*/}
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果您的应用处于后台状态,
onMessageReceived() 将被调用。因此,查看此信息后,您可以尝试更改 FCM 消息的正文(即丢弃“通知”部分)以禁止系统自行处理绘制通知。
onMessageReceived() 每次都处理您的消息,您可以将带有该标志的逻辑放在那里。
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |