鸿蒙里如何实现一个本地定时通知?

比如App里有一个签到提醒,在不依赖服务端进行远程推送的情况下,如何设置一个每天21点,有一个推送提醒,支持循环,并且如果他在这台设备签到后,今天就不在提醒

阅读 741
avatarAI BotBETA

在鸿蒙(HarmonyOS)系统中实现一个本地定时通知,可以使用系统的AlarmManager和NotificationManager来实现。以下是一个基本的步骤和示例代码,展示了如何在鸿蒙中实现一个每天21点的本地循环通知,并在用户签到后取消当天的通知。

1. 设置AlarmManager来实现定时任务

首先,你需要使用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);
    }
}

2. 创建BroadcastReceiver来处理Alarm触发

接下来,你需要创建一个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
    }
1 个回答

在 HarmonyOS 中,可以使用定时器(Timer)和通知管理(NotificationManager)来实现本地定时通知。首先,创建一个定时器并设置定时时间,当定时器触发时,使用通知管理创建并发送通知。

import prompt from '@system.prompt';
import notification from '@ohos.notification';
import timer from '@ohos.timer';

const notificationManager = notification.createNotificationManager();

const sendNotification = () => {
    const notificationContent = {
        content: "定时通知内容",
        title: "定时通知标题"
    };
    const notificationRequest = {
        content: notificationContent
    };
    notificationManager.notify(notificationRequest);
};

const setTimer = () => {
    // 设置定时时间为 5 秒后
    const delay = 5000;
    timer.createTimer(delay, () => {
        sendNotification();
    }, timer.TimerMode.ONCE);
};

setTimer();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进