比如App里有一个签到提醒,在不依赖服务端进行远程推送的情况下,如何设置一个每天21点,有一个推送提醒,支持循环,并且如果他在这台设备签到后,今天就不在提醒
比如App里有一个签到提醒,在不依赖服务端进行远程推送的情况下,如何设置一个每天21点,有一个推送提醒,支持循环,并且如果他在这台设备签到后,今天就不在提醒
在鸿蒙(HarmonyOS)系统中实现一个本地定时通知,可以使用系统的AlarmManager和NotificationManager来实现。以下是一个基本的步骤和示例代码,展示了如何在鸿蒙中实现一个每天21点的本地循环通知,并在用户签到后取消当天的通知。
首先,你需要使用AlarmManager来设置一个每天21点的定时任务。
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Application;
import ohos.bundle.IBundleManager;
import ohos.security.SystemPermission;
import ohos.multimodalinput.alarm.AlarmManager;
import ohos.multimodalinput.alarm.AlarmRequest;
import ohos.multimodalinput.alarm.OperationCallback;
import java.util.Calendar;
public class MainAbility extends Ability {
private static final long ALARM_TRIGGER_AT_TIME = AlarmManager.ALARM_REALTIME;
private AlarmManager alarmManager;
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
setDailyAlarm();
}
private void setDailyAlarm() {
if (verifySelfPermission(SystemPermission.SET_ALARM) != IBundleManager.PERMISSION_GRANT) {
requestPermissionsFromUser(
new String[]{SystemPermission.SET_ALARM},
0
);
return;
}
alarmManager = (AlarmManager) getSystemService(Ability.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 21);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long triggerAtTime = calendar.getTimeInMillis();
if (calendar.getTimeInMillis() < System.currentTimeMillis()) {
triggerAtTime += 24 * 60 * 60 * 1000; // Add one day if the time has passed today
}
AlarmRequest alarmRequest = new AlarmRequest.Builder()
.setAlarmTime(triggerAtTime)
.setRepeatInterval(AlarmManager.INTERVAL_DAY)
.setTriggerType(ALARM_TRIGGER_AT_TIME)
.build();
alarmManager.scheduleAlarm(alarmRequest, new OperationCallback() {
@Override
public void onComplete(Object obj) {
if (obj instanceof Boolean && (Boolean) obj) {
// Alarm set successfully
} else {
// Failed to set alarm
}
}
@Override
public void onError(int i, String s, Object o) {
// Handle error
}
}, null);
}
}
接下来,你需要创建一个BroadcastReceiver来处理Alarm触发后的逻辑,即显示通知。
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
import ohos.bundle.IBundleManager;
import ohos.notification.Notification;
import ohos.notification.NotificationManager;
import ohos.notification.NotificationRequest;
import ohos.security.SystemPermission;
public class AlarmReceiver extends ohos.aafwk.content.BroadcastReceiver {
@Override
public void onReceive(ohos.aafwk.content.Context context, Intent intent) {
if (verifySelfPermission(context, SystemPermission.WRITE_SETTINGS) != IBundleManager.PERMISSION_GRANT) {
requestPermissionsFromUser(context, new String[]{SystemPermission.WRITE_SETTINGS}, 0);
return;
}
// Create a notification
Notification notification = new Notification.Builder(context)
.setContentTitle("签到提醒")
.setContentText("请记得签到")
.setSmallIcon(ResourceTable.Media_app_icon)
.build();
NotificationRequest notificationRequest = new NotificationRequest.Builder(context)
.setNotification(notification)
.setRequestId(1)
.build();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Ability.NOTIFICATION_SERVICE);
notificationManager.publishNotification(notificationRequest);
// Optionally, you can add logic here to check if the user has signed in today
// and cancel the notification if they have
}
在 HarmonyOS 中,可以使用定时器(Timer)和通知管理(NotificationManager)来实现本地定时通知。首先,创建一个定时器并设置定时时间,当定时器触发时,使用通知管理创建并发送通知。