如何在Kotlin中取消预定的本地通知?



我有一个应用程序,用户创建自己的本地通知。用户声明通知应该弹出的名称、日期和时间,并指定重复频率。然后在另一个片段的recyclerview中列出通知。用户可以通过向左滑动其recyclerview项来删除通知。

但是当我创建一个通知,删除它,然后它仍然弹出在指定的时间

我在SharedPreferences中存储notificationID作为创建日期(以便我可以将其存储在我的DB中)。我将它作为一个带有putExtra的字符串传递给我的BroadcastReceiver类,我将notificationID作为一个字符串在我的BroadcastReceiver类中带有getStringExtra。然后将相同的notificationID.toInt()传递给pendingIntent.getActivity。然后在我的Fragment与recyclerView我传递相同的notificationID取消,它仍然没有取消。

也许我使用了错误的标志?非常感谢你的帮助。

这是我的BroadcastReceiver类:

const val titleExtra = "titleExtra"
const val descriptionExtra = "descriptionExtra"
val notificationID = "notificationID"
class Notification: BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

val intentToRepeat = Intent(context, MainActivity::class.java)
val id = intent.getStringExtra(notificationID).toString()
val pendingIntent = PendingIntent.getActivity(context, id.toInt(), intentToRepeat, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
val notification = NotificationCompat.Builder(context, channelID)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle(intent.getStringExtra(titleExtra))
.setContentText(intent.getStringExtra(descriptionExtra))
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build()

val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if (intent.action == "cancel") {
manager.cancel(id.toInt())
}
else {
manager.notify(id.toInt(), notification)
}
}
}

我的AndroidManifest:

<receiver android:name=".powiadomienia.Powiadomienie" android:enabled="true" 
android:exported="false">
<intent-filter>
<action android:name="cancel"/>
<action android:name="create" />
</intent-filter>
</receiver>

在我的recyclerview中列出通知:

val currentNotification: SetNotification = listAdapter.getNotificationByPosition(viewHolder.bindingAdapterPosition)
if(direction == ItemTouchHelper.LEFT) {
// CANCEL
//val manager = requireContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//manager.cancel(currentPowiadomienie.notificationId!!)

val alarmManager = requireActivity().getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(requireContext(), Notification::class.java)
intent.action = "cancel"
val pendingIntent = PendingIntent.getService(requireContext(), currentNotification.notificationId!!.toInt(), intent, PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE)
pendingIntent?.let { _pendingIntent ->
alarmManager.cancel(_pendingIntent)
}

manager.cancel()和alarmManager.cancel()都不起作用。

通知已创建,但如何取消它?

我认为您需要在alarmManager.cancel()之后调用notifydatasetchanged()方法,如下所示:

val currentNotification: SetNotification = 
listAdapter.getNotificationByPosition(viewHolder.bindingAdapterPosition)
if(direction == ItemTouchHelper.LEFT) {
val alarmManager = 
requireActivity().getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(requireContext(), Notification::class.java)
intent.action = "cancel"
val pendingIntent = PendingIntent.getService(requireContext(), 
currentNotification.notificationId!!.toInt(), intent, 
PendingIntent.FLAG_CANCEL_CURRENT or 
PendingIntent.FLAG_IMMUTABLE)
pendingIntent?.let { _pendingIntent ->
alarmManager.cancel(_pendingIntent)
notifyDataSetChanged()
}

我已经解决了无法取消即将到来的通知的问题:

我想我传递了错误的上下文。检查你是否传递了正确的

取消通知:

private fun removeAlarm(id: Int){
val alarmManager = activity?.getSystemService(Context.ALARM_SERVICE) as AlarmManager
// Notification = BroadcastReceiver class
val intent = Intent(requireContext(), Notification::class.java)
val pendingIntent = PendingIntent.getBroadcast(requireContext(), id, intent, PendingIntent.FLAG_IMMUTABLE)
alarmManager.cancel(pendingIntent)
}

最新更新