В моем коде Kotlin я запрашиваю Firestore на предмет изменений, и на основании условия пользователю отправляется уведомление. Нормально ли для кода отправлять одно и то же уведомление 4 раза, если в базе данных изменяются 4 поля? я ожидал, что будет отправлено только одно уведомление. мой код выглядит следующим образом:
docref.collection("Users").whereEqualTo("uid", userid!!)
.addSnapshotListener { value, task ->
if(task!=null){
return@addSnapshotListener
}
for (document in value!!) {
val current_user_bid_lead_num = document.getLong("bid_lead")!!
val new_user_bid_lead_num = current_user_bid_lead_num + 1
docref.collection("winning_bid").whereEqualTo("previous_seller_id",userid!!).addSnapshotListener{value, task->
if(task!=null){
return@addSnapshotListener
}
for (document in value!!){
Log.d("userid",userid)
val losing_seller = document.getString("previous_seller_id")
val deal_num_lost = document.getLong("deal_num")!!
val winningbid_bid_lead_num = document.getLong("bid_lead")!!
if(usersid == losing_seller && current_user_bid_lead_num < winningbid_bid_lead_num) {
LosingBidNotificationChannel()
val CHANNEL_ID = "Losing Bid"
val intent = Intent(this, Mydeals_seller::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.openbidicon)
.setContentTitle("OpenBid")
.setContentText("Your bid has lost the lead")
.setStyle(
NotificationCompat.BigTextStyle()
.bigText("Your bid is no longer leading for Deal #${deal_num_lost}")
)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setChannelId(CHANNEL_ID)
.setAutoCancel(true)
.build()
with(NotificationManagerCompat.from(this)) {
notify(id, builder)
id++
}
}
newdealnumref = FirebaseFirestore.getInstance().collection("Users")
newdealnumref.document(userid).update("bid_lead",winningbid_bid_lead_num).addOnSuccessListener {
}.addOnFailureListener{e->
Log.w("firestore_create_error","Error writing to document",e)
}
}
}
}
}
Итак, я получаю результаты правильного всплывающего уведомления, но не ожидаю уведомления, потому что в базе данных изменилось несколько полей.
Например, val losing seller
и val winningbid_bid_lead_num
могут измениться одновременно, что приведет к отправке 2 уведомлений. Как я могу ограничить это?
Редактировать: Протестировав его немного дальше, я заметил, что приложение, похоже, накапливает уведомления, и даже если я очищаю их и моделирую процесс, один раз уведомление публикуется, общее количество всплывающих уведомлений будет увеличиваться, например, с 10 до 16. Таким образом, есть способ очистить память от ранее очищенных уведомлений.
Обновление - проблема Похоже, что связано с этой частью:
with(NotificationManagerCompat.from(this)) {
notify(id, builder)
id++
}
}
Но если я не включу вышеперечисленное, я не смогу показать более 1 нового уведомления. Является ли вышеуказанный правильный способ отображения более 1 нового уведомления, но при этом android не накапливает счетчик и не отправляет одно и то же уведомление несколько раз на основе указанного выше счетчика? Например, есть ли проверка, которую я могу запустить, если она проверяет, было ли уведомление очищено, и если оно было, то сбросьте счетчик на 0?