Android 广播接收器中的重复警报

Android repeating alarm in Broadcast Receiver

我的闹钟启动通知服务。 A 想让我的闹钟在每个月的第 7 天在 14:00

响起

我的收件人:

public class AlarmReceiver extends BroadcastReceiver {
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;

@Override
public void onReceive(Context context, Intent intent) {
    System.out.println("RECEIVER STARTED");
    if (checkForDay()) {
        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent1 = new Intent(context, AlarmService.class);
        alarmIntent = PendingIntent.getService(context, 0, intent1, 0);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 14);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent);
        System.out.println("ALARM SET");
    } else
        System.out.println("ALARM NOT SET");
}

private boolean checkForDay() {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    return calendar.get(Calendar.DATE) == 7;

}

我的接收器从 BOOT_COMPLETE 开始并从 MainActivity onCreate() 中的广播开始; 但是有问题。

  1. 如果用户保持 phone 24/7 启动会怎样
  2. 用户可以在 14:00 之后启动我的应用程序并且警报会立即触发 - 不想这样。仅在 14:00
  3. 用户可能会忘记启动我的应用程序,闹钟根本不会触发

如果 setInexactRepeating() 不好,因为间隔,如何实现正确的每月重复警报。不是每个月都一样吗?

情况 1:[如果用户保持 phone 24/7 启动会怎样]

在这种情况下,一切顺利。当第 7 天的闹钟在 14:00 触发时,您可以设置下一个第 7 天的闹钟

情况 2:[用户可以在 14:00 之后启动我的应用程序,并且警报会立即触发 - 不想要它。仅在 14:00]

在这种情况下,只需添加一个检查来处理或不处理您需要在每个月的第 7 天 14:00

执行的逻辑

案例 3:[用户可能忘记启动我的应用程序,闹钟根本不会触发]

你可以使用重启事件,它有效。