如何阻止基于 SharedPreferences 值的通知?

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()我可以覆盖另一个功能来拦截通知并取消它吗?

Sta*_*lov 5

如果我正确理解了您的问题,那么您正在谈论当您的应用程序未运行时接收推送消息的情况。您已经提到onMessageReceived()只有在您的应用程序处于运行状态时才会被调用,但是即使系统没有调用此方法,您的通知也会显示。因此,我们可以得出结论,这些通知是由系统自动绘制的。此行为由 FCM 消息正文中的“通知”和“数据”部分控制。

FCM 消息具有复杂的规范,可在此处找到。但由于我们只对“通知”和“数据”部分感兴趣,我们可以依赖它们的行为:

第一种情况 - “通知”和“数据”部分都存在

例子:

{
  "message":{
    "notification": { /*...*/ },
    "data": {/*...*/}
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您的应用处于后台状态,

  • 系统会自动显示通知;
  • 如果点击此通知,将启动一个活动;
  • 活动的意图将包含“数据”正文和一些有关 FCM 消息的技术信息。

第二种情况 - 仅存在“通知”部分

例子:

{
  "message":{
    "notification": { /*...*/ },
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您的应用处于后台状态,

  • 系统会自动显示通知;
  • 如果点击此通知,将启动一个活动;
  • 活动的意图将包含有关 FCM 消息的技术信息。

第三种情况 - 仅存在“数据”部分

例子:

{
  "message":{
    "data": {/*...*/}
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您的应用处于后台状态,

  • 系统不会自动显示通知;
  • onMessageReceived() 将被调用。

因此,查看此信息后,您可以尝试更改 FCM 消息的正文(即丢弃“通知”部分)以禁止系统自行处理绘制通知。

onMessageReceived() 每次都处理您的消息,您可以将带有该标志的逻辑放在那里。