Java 处理警报通知

Java 处理警报通知,java,android,android-studio,alarmmanager,notificationmanager,Java,Android,Android Studio,Alarmmanager,Notificationmanager,我开始在android上结合alarm manager和notification manager,以下是我的代码: MainActivity.java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setReminderAlarm(); }

我开始在android上结合alarm manager和notification manager,以下是我的代码:

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setReminderAlarm();
}

public void setReminderAlarm() {
    Intent intent = new Intent(MainActivity.this, ReminderReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, ReminderReceiver.NOTIF_ID, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 6);
    calendar.set(Calendar.MINUTE, 59);

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 86400000L, pendingIntent);
}
public static int NOTIF_ID = 101;

@Override
public void onReceive(Context context, Intent intent) {
    showAlarmNotification(context);
}

public void showAlarmNotification(Context context) {
    Intent intentClick = new Intent(context, MainActivity.class);
    PendingIntent pendingClick = PendingIntent.getActivity(context, 0, intentClick, 0);
    NotificationManager notificationManagerCompat = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.cinema)
            .setContentTitle(title)
            .setContentIntent(pendingClick)
            .setContentText(message)
            .setColor(ContextCompat.getColor(context, android.R.color.transparent))
            .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000})
            .setSound(alarmSound)
            .setAutoCancel(true);
    notificationManagerCompat.notify(NOTIF_ID, builder.build());
}
rementerreceiver.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setReminderAlarm();
}

public void setReminderAlarm() {
    Intent intent = new Intent(MainActivity.this, ReminderReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, ReminderReceiver.NOTIF_ID, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, 6);
    calendar.set(Calendar.MINUTE, 59);

    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 86400000L, pendingIntent);
}
public static int NOTIF_ID = 101;

@Override
public void onReceive(Context context, Intent intent) {
    showAlarmNotification(context);
}

public void showAlarmNotification(Context context) {
    Intent intentClick = new Intent(context, MainActivity.class);
    PendingIntent pendingClick = PendingIntent.getActivity(context, 0, intentClick, 0);
    NotificationManager notificationManagerCompat = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.cinema)
            .setContentTitle(title)
            .setContentIntent(pendingClick)
            .setContentText(message)
            .setColor(ContextCompat.getColor(context, android.R.color.transparent))
            .setVibrate(new long[]{1000, 1000, 1000, 1000, 1000})
            .setSound(alarmSound)
            .setAutoCancel(true);
    notificationManagerCompat.notify(NOTIF_ID, builder.build());
}
每次运行应用程序时,即使我已设置了时间,通知始终会出现。我如何防止这种情况?
谢谢。

问题是您正在将时间设置为当天。因此,如果您在6:00后打开应用程序,您的报警管理器将立即启动

您需要检查当天的时间是否超过6:00,如果是,您需要将日期更改为第二天:

public void setReminderAlarm() {
    Intent intent = new Intent(MainActivity.this, ReminderReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, ReminderReceiver.NOTIF_ID, intent, 0);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    int curHr = calendar.get(Calendar.HOUR_OF_DAY);
    // Checking whether current hour is over 6
    if (curHr >= 6)
    {
        // Since current hour is over 6, setting the date to the next day
        calendar.add(Calendar.DATE, 1);
    }
    calendar.set(Calendar.HOUR_OF_DAY, 6);
    calendar.set(Calendar.MINUTE, 59);
    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 86400000L, pendingIntent);
}

因此,您希望警报每天7:59触发。是的,我希望我的警报每天6:59触发。因此,您的方式如何工作,为什么我们需要在那里添加int curHr和date?因为您正在将时间设置为当前日期。因此,如果您在6:00后打开应用程序,您的报警管理器将立即启动。因此,您需要检查当天的时间是否超过6:00,如果是,您需要将日期更改为第二天。所以警报会在第二天06:00触发。