安卓自定义定时通知实现
作者:访客发布时间:2023-10-26分类:程序开发学习浏览:127
安卓自定义通知实现
前言
自定义通知就是使用自定义的布局,实现自定义的功能.
通知的常规布局中可以设置标题、内容、大小图标,也可以实现点击跳转等。
常规的布局固然方便,可当需求变多就只能使用自定义布局了.
我想要实现的通知布局除了时间、标题、图标、跳转外,还有“5分钟后提醒”、“已知悉”这两个功能需要实现。如下图所示:
正文
一、待办数据库
1个、待办实体类
假设现在时间是12个点,添加了一个14点的待办会议,并设置提前20分钟进行提醒那就是。
其中Year、Month、Days、Time构成会议的时间,也就是今天的14点那就是。内容是待办的内容.提醒是该待办提前提醒的时间,也就是20分钟那就是。类型是待办类型,包括未完成,已完成和忽略那就是。
2个、数据访问DAO
添加或更新一条待办事项
@INSERT(onConflict=OnConflictStrategy y.REPLACE)注解:如果指定id的对象没有保存在数据库中,就会新增一条数据到数据库。如果指定id的对象数据已经保存到数据库中,就会删除掉原来的数据,然后新增一条数据。
3个、数据库封装
在仓库层的TodoStoreRepository
类中对待办数据库的操作进行封装.不赘述了.
二、添加定时器
每条待办都对应着一个定时任务,在用户添加一条待办数据的同时需要添加一条对应的定时任务.在这里使用映射的方式,将待办的ID和定时任务一一绑定。
1个、思路:
- 首先要构造一个地图<;长,计时器任务>;>;类型的参数和一个定时器计时器。
- 在添加定时任务前,先对待办数据进行过滤.
- 计算出延迟的时间.
- 定时器调度,当触发时,消息弹窗提醒.
2个、实现
说明:
- Isover()--判断该待办有没有完成,通过待办的类型进行判断。
代码:Fun Isover()=type==1
延迟时间--延迟时间。获取到当前时间的时间戳、将待办提醒的时间转换为时间戳,最后相减,得到一个Long类型的时间戳即延迟时间.
当Delay Time大于0时,进行定时器调度,将待办ID与定时任务绑定,当延迟时间到达时会触发定时器任务,定时器任务中包含了消息弹窗提醒。
3个、封装
在TodoScheduleUseCase类中将待办数据插入和待办定时器创建封装在一起了,插入数据后获取到数据的ID,将id赋值传给待办定时器任务。
三、注册广播
1.首先创建一个待办事项通知接收器广播
在待办事项通知接收方中,首先获取到待办数据,根据操作判断广播的类型并执行相应的回调。
2.自定义操作
分别是“5分钟后提醒”、“已知悉”的操作
3.广播注册方法
4.广播注册及回调实现
“5个分钟后提醒”实现是调用delayTodoTask5min
方法,原理就是将remind
即提醒时间减5达到五分钟后提醒的效果.并取消该通知.再将修改过属性的待办重新添加到待办列表中.
“已知悉”实现是调用markTodoTaskDone
方法,原理就是将type
属性标记成1、代表已完成.并取消该通知.再将修改过属性的待办重新添加到待办列表中.
/**
* 延迟5分钟
*/
fun delayTodoTask5min(todoInfo: TodoInfo) {
useScope.launch {
todoInfo.remind -= 5
insertOrUpdateTodo(todoInfo)
}
}
/**
* 标记已完成
*/
fun markTodoTaskDone(todoInfo: TodoInfo) {
useScope.launch {
todoInfo.type = 1
insertOrUpdateTodo(todoInfo)
}
}
四、自定义通知构建
fun showNotify(todoInfo: TodoInfo) {
binding = LayoutTodoNotifyItemBinding.inflate(context.layoutInflater())
// 自定义通知布局
val notificationLayout =
RemoteViews(context.packageName, R.layout.layout_todo_notify_item)
// 设置自定义的Action
val notifyAfterI = Intent().setAction(TodoNotifyReceiver.TODO_CHANGE_ACTION)
val alreadyKnowI = Intent().setAction(TodoNotifyReceiver.TODO_ALREADY_KNOW_ACTION)
// 传入TodoInfo
notifyAfterI.putExtra("todoInfo", todoInfo)
alreadyKnowI.putExtra("todoInfo", todoInfo)
// 设置点击时跳转的界面
val intent = Intent(context, MarketActivity::class.java)
val pendingIntent = PendingIntent.getActivity(context, todoInfo.id.toInt(), intent, PendingIntent.FLAG_CANCEL_CURRENT)
val notifyAfterPI = PendingIntent.getBroadcast(context, todoInfo.id.toInt(), notifyAfterI, PendingIntent.FLAG_CANCEL_CURRENT)
val alreadyKnowPI = PendingIntent.getBroadcast(context, todoInfo.id.toInt(), alreadyKnowI, PendingIntent.FLAG_CANCEL_CURRENT)
//给通知布局中的组件设置点击事件
notificationLayout.setOnClickPendingIntent(R.id.notify_after, notifyAfterPI)
notificationLayout.setOnClickPendingIntent(R.id.already_know, alreadyKnowPI)
// 构建自定义通知布局
notificationLayout.setTextViewText(R.id.notify_content, todoInfo.content)
notificationLayout.setTextViewText(R.id.notify_date, "${todoInfo.year}-${todoInfo.month + 1}-${todoInfo.day} ${todoInfo.time}")
var notifyBuild: NotificationCompat.Builder? = null
// 构建NotificationChannel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(context.packageName, "todoNotify", NotificationManager.IMPORTANCE_HIGH)
notificationChannel.lockscreenVisibility = Notification.VISIBILITY_SECRET
notificationChannel.enableLights(true) // 是否在桌面icon右上角展示小红点
notificationChannel.lightColor = Color.RED// 小红点颜色
notificationChannel.setShowBadge(true) // 是否在久按桌面图标时显示此渠道的通知
notificationManager.createNotificationChannel(notificationChannel)
notifyBuild = NotificationCompat.Builder(context, todoInfo.id.toString())
notifyBuild.setChannelId(context.packageName);
} else {
notifyBuild = NotificationCompat.Builder(context)
}
notifyBuild.setSmallIcon(R.mipmap.icon_todo_item_normal)
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
.setCustomContentView(notificationLayout) //设置自定义通知布局
.setPriority(NotificationCompat.PRIORITY_MAX) //设置优先级
.setAutoCancel(true) //设置点击后取消Notification
.setContentIntent(pendingIntent) //设置跳转
.build()
notificationManager.notify(todoInfo.id.toInt(), notifyBuild.build())
// 取消指定id的通知
fun cancelNotifyById(id: Int) {
notificationManager.cancel(id)
}
}
步骤:
- 构建自定义通知布局
- 设置自定义的操作
- 传入待办数据
- 设置点击时跳转的界面
- 设置了两个广播接收器类型的点击回调
- 给通知布局中的组件设置点击事件
- 构建自定义通知布局
- 构建通知频道
- 添加取消指定id的通知方法
总结
以上,安卓自定义定时通知实现的过程和结果。文章若出现错误,欢迎各位批评指正,写文不易,转载请注明出处谢谢.
相关推荐
- 安卓:实现一个全屏拖拽、自动贴边半隐藏的自定义视窗
- 安卓自定义视图-实现图片堆叠效果
- 自定义登录徽标和URL最好的WordPress常用插件下载博客插件模块
- 今天我们将深入探讨WordPress推送通知到底是什么,它们如何帮助您扩大网站的覆盖范围,以及如何快速将它们添加到您的网站。典型设置只需不到10分钟!
- 在本文中,我们将向您展示如何在不使用任何插件的情况下显示WordPress网站cookie通知。
- 你将了解你需要知道的关于WordPress更新通知的一切,以及你如何在你的网站上完全或部分地禁用它们。
- 在本教程中,我们将向您展示如何获得在WordPress中等待审核的文章的电子邮件通知。
- 推送通知可让您向用户发送消息,即使他们没有访问您的网站。这有助于您将用户带回您的网站,增加流量并赚取更多收入。在本教程中,我们介绍何将网络推送通知添加到您的WordPress站点。
- 将新内容通知您的订阅者有助于您与访问者保持联系,将他们带回您的网站,并将他们转化为客户。在本教程中,我们将说明如何通知订阅者WordPress博客上发布了新文章。
- 有没有发现一些WordPress网站会给你发送推送通知,比如在Chrome浏览器,比如在Windows 10通知。推送通知帮助你实现即使用户没有访问您的网站,也可以向他们发送消息,这类似于iOS和Android的系统的Push推送。
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 8Android广播如何解决Sending non-protected broadcast问题
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版