#夏日挑战赛# HarmonyOS - 实现消息定时提醒 原创 精华
作者:张明伟
前言
在一些应用中,需要通过时间设置提醒用户操作,如闹钟,象棋步数倒计时等。
设计思路:将对时间的获取与响应的结果拆分开,时间的获取可以有倒计时与直接设计时间。响应结果可以是:震动,闪烁,通知栏,铃声。
项目涵盖了IntetAgent,通知,以及JS FA调用PA等知识点,项目应用到了前面同事编写的计时器组件#夏日挑战赛# HarmonyOS - 自定义组件之计时器
效果展示
如果需要展示震动和弹出效果,需要通过物理机进入通知管理,勾选横幅通知和锁屏通知并且修改震动为其他震动方式。
倒计时提醒如下图:
闹钟类提醒如下图:
实现步骤
1. 声明权限
2. 构建前端页面
前端页面主要是获取设置的倒计时以及设置的闹钟类的时间,封装进一个对象ActionData通过调用接口传递给PA处理。
主要分为两部分:一部分是倒计时提醒界面,一部分是闹钟类提醒界面。
在编写页面的时候遇到了一个问题:由于初步编写hml页面,不知道如何实现input输入框的双向绑定,后面请教后解决:通过change事件来触发
hml代码如下:
主要js代码如下:
通过不同的命令实现不同的调用。
3. 设置ReminderRequest类
3.1 设置通知插槽NotificationSlot
这里有个坑,需要手动设置手机的通知管理的通知铃声,打开震动才有震动效果,打开横幅通知才有通知弹出效果。设置如下图:
设置通知slot需要真实的手机才有震动效果,设置呼吸灯需要手机支持呼吸灯才有效果。
3.2 创建提醒类对象
ReminderRequest分为3个子类:1.ReminderRequestTimer ,2.ReminderRequestCalendar ,3.ReminderRequestAlarm。
ReminderRequestTimer 对象创建
用于倒计时提醒,需要传递进一个倒计时的秒的参数。这个数据是从前端页面传过来的。
ReminderRequestAlarm对象创建
用于闹钟类提醒,需要传递时间数据。需要三个参数:int hour,int minute,int[] repeatDay
3.3 设置提醒标题和内容
提醒是以通知形式来表现的。设置通知展示的标题和内容。
3.4 设置提醒时长属性
提醒默认提醒一次,如果需要提醒能长时间提醒,进行如下设置:
3.4 设置IntentAgent
需要设置BundleName和AbilityName。且AbilityName需要全类名(加上包名),才能实现页面的跳转。点击提醒弹出的通知就会跳转到对应的页面
3.5 设置延时提醒,功能按钮
延时提醒和设置延时的时间,设置延时后提醒的次数。
当提醒时会发出通知,设置延迟提醒和关闭按钮。
在这里有一个坑:通过测试得,延迟提醒的最短时间为300s(5分钟)如果设置时间小于300s则为默认的。
注意:对于倒计时提醒设置延迟提醒不起作用,只有设置提醒时长有效。
3.6 发布和取消提醒
发布和取消提醒都是通过ReminderHelper这个类来完成的,取消提醒需要获取发布提醒后返回的一个整型id来识别需要取消哪一个提醒。
总结
对于提醒类ReminderRequest的3个子类来说,ReminderRequestTimer用于倒计时提醒,ReminderRequestAlarm用于闹钟类提醒,ReminderRequestCalendar类用于日历类提醒。本项目还有日历类提醒(ReminderRequestCalendar)的功能没有实现,通过API可以发现其与闹钟类提醒的功能实现大致一样。在运用时需要注意其中的一些细节,才能正确使用。
更多原创内容请关注:中软国际 HarmonyOS 技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
日历类提醒要同时设置日期和时间所以会复杂些吗?
日历提醒类ReminderRequestCalendar与闹钟提醒类ReminderRequestAlarm都是ReminderRequest的一个子类,他们的构造方法不同,要传入的参数不同。ReminderRequestCalendar传入的参数比ReminderRequestAlarm的参数要复杂一些,但是原理是一样的
懂了,感谢大佬回复!
private NotificationSlot setSlot 这个方法是要添加在哪个文件中?
他是一个创建NotificationSlot的对象的方法,是在PA里面,我的是ReminderAbility继承自AceInternalAbility。
好的,感谢大佬回复!
有完整的代码吗