当前位置: 首页 > 科技观察

HarmonyOS-实现消息定时提醒

时间:2023-03-12 10:13:53 科技观察

了解更多开源请访问:51CTO开源基础软件社区https://ost.51cto.com前言在部分应用中,它需要通过时间设置来提醒用户操作,比如闹钟、走棋倒计时等。设计思路:将时间的获取和响应的结果分开。时间的获取可以有倒计时和直接设计时间。响应结果可以是:振动、闪烁、通知栏、铃声。项目涉及IntetAgent、通知、JSFA调用PA等知识点。项目应用到了之前同事#夏日挑战赛#HarmonyOS-自定义组件的定时器。效果展示如果需要展示震动和弹窗效果,需要通过实体机进入通知管理,勾选横幅通知和锁屏通知,将震动修改为其他震动方式。倒计时提醒如下图:闹钟提醒如下图:实现步骤1.声明权限"reqPermissions":[{"name":"ohos.permission.PUBLISH_AGENT_REMINDER"}]2.搭建前端页面前端页面主要是获取设置的倒计时和闹钟类的设置时间,封装成一个对象ActionData,通过调用接口传递给PA处理。主要分为两部分:一是倒计时提醒界面,二是闹钟提醒界面。写页面的时候遇到一个问题:由于初次写html页面,不知道如何实现input输入框的双向绑定。求教后解决:通过change事件触发。hml代码如下:倒计时:{{leftTime}}s

小时:分钟:
主要js代码如下:分别使用不同的命令实现不同的传输//双向绑定实现changeHour(event){this.hour=event.value;},changeMinute(event){this.minute=event.value},changeCountDown(event){this.countDown=event.value},//闹钟提醒alarmClock:function(){this.notification(0x1003);},//倒计时提醒alarmCountdown:function(){this.leftTime=0;//重置倒计时倒计时this.leftTime=this.countDown;//同步倒计时倒计时this.notification(0x1002);},//取消提醒cancel:function(){this.notification(0x1001);},//初始化动作数据initAction:function(code){varactionData={hour:this.hour,minute:this.minute,countDown:this.countDown};actionData.notify="这个actionData是JS形成的";变种行动={};action.bundleName="com.chinasoft.reminder";action.abilityName="提醒能力";行动。消息代码=代码;行动。数据=动作数据;行动。能力类型=1;行动。同步选项=0;骨灰盒行动;},//调用PA接口通知:asyncfunction(code){try{varaction=this.initAction(code);varresult=awaitFeatureAbility.callAbility(action);this.showToast(结果);}catch(pluginError){console.error("startNotification:PluginError="+pluginError);}},3.设置ReminderRequest类(1)设置通知槽NotificationSlot这里有一个坑,需要手动设置手机通知管理的通知铃声,开启震动才有震动效果,并开启在横幅通知上具有通知弹出效果。设置如下图:设置通知槽需要真手机有震动效果,设置呼吸灯需要手机支持呼吸灯才有效果。/**设置通知槽**/privateNotificationSlotsetSlot(){//1.设置通道信息NotificationSlotslot=newNotificationSlot("slot_id","slot_name",NotificationSlot.LEVEL_HIGH);slot.setDescription("slot_description");//设置NotificationSlot的描述信息。slot.enableBypassDnd(true);//设置是否绕过系统免打扰模式slot.setEnableLight(false);//设置收到通知时是否开启呼吸灯,前提是当前硬件支持呼吸灯。slot.setEnableVibration(true);//设置是否在收到通知时开启振动。slot.setLedLightColor(123456);返回槽;}//2.给代理服务添加一个通道对象ReminderHelper.addNotificationSlot(setSlot());(2)创建提醒类对象ReminderRequest分为3个子类:1.ReminderRequestTimer,2.ReminderRequestCalendar,3.ReminderRequestAlarm。ReminderRequestTimer对象创建。对于倒计时提醒,需要传入一个倒计时秒参数。这个数据是从前端页面传递过来的。ReminderRequestreminderRequestTimer=newReminderRequestTimer(countDown);ReminderRequestAlarm对象创建。对于闹钟提醒,需要传递时间数据。需要三个参数:inthour,intminute,int[]repeatDay。ReminderRequestreminder=newReminderRequestAlarm(hour,minute,repeatDay);(3)设置提醒标题和内容提醒以通知的形式表现。设置通知显示的标题和内容。reminderRequestTimer.setTitle("倒计时").setContent("炸弹");//设置标题和内容(4)设置提醒时长属性,默认提醒一次。如果需要长时间提醒,设置如下:reminder.setRingDuration(10);//设置提醒时长(5)设置IntentAgent需要设置BundleName和AbilityName。而AbilityName需要全类名(加上包名)才能实现页面跳转。点击弹窗通知跳转到相应页面。reminder.setIntentAgent(BUNDLE_NAME,ABILITY_NAME);(6)设置延迟提醒,功能键延迟提醒和设置延迟时间,设置延迟后的提醒次数。收到提醒时收到通知,设置贪睡提醒和关闭按钮。reminder.setSnoozeTimes(2)//设置延迟提醒次数.setTimeInterval(1*60);//设置一分钟,实际是5分钟reminder.setActionButton("Delay",ReminderRequest.ACTION_BUTTON_TYPE_SNOOZE).setActionButton("Close",提醒请求.ACTION_BUTTON_TYPE_CLOSE);这里有一个坑:通过测试,延迟提醒的最短时间是300s(5分钟)。如果设置的时间小于300s,则默认。注意:倒计时提醒设置延迟提醒不起作用,只有提醒时长有效。(7)发布和取消提醒发布和取消提醒都是通过ReminderHelper类来完成的。取消提醒需要获取提醒发出后返回的整数id,用于标识需要取消的提醒。intreminderId=ReminderHelper.publishReminder(reminder);//发布提醒ReminderHelper.cancelReminder(this.reminderId);//取消提醒摘要对于提醒类ReminderRequest的三个子类,ReminderRequestTimer用于倒计时提醒,ReminderRequestAlarm用于闹钟Reminder,ReminderRequestCalendar类用于日历提醒。本项目还有一个日历提醒(ReminderRequestCalendar)功能没有实现。通过API可以发现和闹钟提醒功能大致相同。您需要注意一些细节才能正确使用它。了解更多开源信息,请访问:51CTO开源基础软件社区https://ost.51cto.com。