kotlin - 从 RecyclerView 适配器内部访问 AlarmManager
问题描述
我正在课堂上制作一个 Android 闹钟应用程序。警报显示在主要活动的回收视图中,我希望在按下时将它们删除。我可以从我设置的警报数据库中清除它,但我无法访问 AlarmManager 来取消警报,而且 PendingIntent 的上下文似乎也是错误的。
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, index: Int) {
val myViewHolder = holder as MyViewHolder
val sdf = SimpleDateFormat("HH:mm EEEE")
myViewHolder.tvAlarmTime.text = sdf.format(alarms[index].milliseconds)
myViewHolder.tvAlarmFrequency.text = alarms[index].frequency
myViewHolder.itemView.setOnClickListener {
launch {
withContext(Dispatchers.IO) {
val db = AlarmDatabase.getDatabase(myViewHolder.tvAlarmTime.context)
db.alarmDao().deleteTriggeredAlarm((alarms[index].id))
}
}
val pi = PendingIntent.getBroadcast(this, (alarms[index].id).toInt(), Intent("alarmTask"), PendingIntent.FLAG_UPDATE_CURRENT)
val alarmMgr = getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmMgr.cancel(pi)
}
}
在最后 3 行中,上下文的类型不匹配,因为这是 MyAdapter 类型 - 我不确定我需要在这里放什么,类似于 MainActivity.context 我假设
getSystemService 还将类型推断错误显示为字符串,我认为这导致 context.ALARM_SERVICE 作为字符串而不是上下文的类型不匹配。
什么是正确的上下文以及如何访问适配器内的 AlarmManager?
解决方案
您可以使用项目视图的上下文:
val context = myViewHolder.itemView.context
val pi = PendingIntent.getBroadcast(context, (alarms[index].id).toInt(), Intent("alarmTask"), PendingIntent.FLAG_UPDATE_CURRENT)
val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmMgr.cancel(pi)
推荐阅读
- angular - 出现错误:''没有找到匹配的模板:'ca-sln'。”.Net Clean Architecture
- android - 使用 just_audio 和 audio_service 播放用户在 mediaItem 上停止的位置
- node.js - VS Code 集成终端在 Linux 上找不到 npm 命令
- typescript - Typescript 映射类型,其中仅保留可为空的属性并转换为字符串类型
- sql - 我需要什么 sql GP 用户原则来授予 CREATE 特权才能让我的触发器仍然工作?
- llvm - LLVM MachineCode,如何获取子虚拟寄存器(获取 64 位虚拟寄存器的低 32 位)?
- ruby - 运行 shopify-cli (ruby gem) 时未初始化的常量 Encoding::UTF_8 (NameError)
- php - 字符串中具有多个匹配项的正则表达式
- python - 如何让 python-isort 考虑我的 pypackage.toml 配置?
- sql - 将源更改为数据库后,SQL 语句对于 Microsoft Access 来说太复杂了