AlarmManager 在初始设置时发送

AlarmManager gets send on initial setup

我的应用程序有问题,在第一次启动时我想设置一个警报意图,我希望警报管理器在特定时间每 24 小时向我发送一次通知。 它的每一件事都有效,除了我第一次启动应用程序时(当数据从应用程序中清除时),然后立即发送通知,直到下一次时钟到达时才应该这样做 09:00.

这里是设置闹钟的函数(只在应用第一次运行时调用运行)

public void setAlarm(){
    Toast.makeText(this, "setAlarm()", Toast.LENGTH_LONG).show();
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 9);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);

    Intent alarmIntent = new Intent(this, AlertReceiver.class);

    if(PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_ONE_SHOT) != null){
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
    }
}

这里是广播接收者的通知函数

public void createNotification(Context context, String msg, String msgText, String msgAlert){
    PendingIntent notificIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context);
    mBuilder.setSmallIcon(R.drawable.ic_stat_dmq_notification_icon);
    mBuilder.setTicker(msgAlert); //Ticker!
    mBuilder.setWhen(System.currentTimeMillis());
    mBuilder.setContentTitle(msg); //Title:
    mBuilder.setContentText(msgText); //Text
    mBuilder.setContentIntent(notificIntent);
    mBuilder.setDefaults(NotificationCompat.DEFAULT_SOUND);
    mBuilder.setAutoCancel(true);

    NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(uniqueId, mBuilder.build());

我已经研究了好几天了,但我似乎无法弄明白,也找不到解决方案。如果有人能帮助我,我会很高兴!

你所在的地区是上午 9 点多吗?那可能是您错误的根源。设置为 android 过去某个时间的闹钟会立即触发。尝试:

  calendar.set(Calendar.YEAR, 2017);

疯狂只是为了测试

好吧,我终于想通了。 唯一需要添加的是毕竟 calendar.set

if(calendar.getTimeInMillis() < System.currentTimeMillis()){
            Toast.makeText(this,"1 day have been added", Toast.LENGTH_SHORT).show();
            calendar.add(Calendar.DATE, 1);
}

它基本上只是检查时间是否在过去,如果是,那么它会增加一天,所以闹钟会在第二天响起。