java - 在 Android 中针对事件的开始日期和结束日期设置特定时间的闹钟

标签 java android alarmmanager android-calendar

我有一个日历 Activity ,开始日期为(24 小时格式)2016 年 4 月 27 日 11:00:00,结束日期为 2016 年 4 月 29 日 11:00:00。我有三个时间 10:45:0010:30:0010:15:00,这些时间是为提醒事件而计算的早于实际设定的时间(即开始日期前 15 分钟、30 分钟和 45 分钟)。

此外,闹钟必须每天重复相同的先前时间,直到到达结束日期。

这是我尝试执行此操作的方法,但是下面的代码不会调用警报,也不会每天重复

MainActivity.java

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, Broadcast.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 234324243, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Calendar calendar = Calendar.getInstance();
calendar.set(2016,03,27,11,00,00);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()-(60000*15), pendingIntent); // subtract for 15 mins prior alarm time
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()-(60000*30), pendingIntent); // subtract for 30 mins prior alarm time
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()-(60000*45), pendingIntent); // subtract for 45 mins prior alarm time

Broadcast.java

Log.i("Alarm", "Alarm Manager is called");
Toast.makeText(context, new Date().toString(), Toast.LENGTH_SHORT).show();

我怎样才能实现这个目标?请帮忙

最佳答案

这是我的示例代码,试试这个:

根据需要在下面的代码中修改日期和时间。

 public static int REPEAT_NOTIFICATION1 = 201;
    public static int REPEAT_NOTIFICATION2 = 202;
    public static int REPEAT_NOTIFICATION3 = 203;

     private void repeatNotification() {
        final DateTime dateTime1 = DateTime.now();
        dateTime1.hourOfDay().setCopy(7);
        dateTime1.minuteOfHour().setCopy(30);
        dateTime1.secondOfMinute().setCopy(00);
        final Calendar calendarNotifiedTime1 = Calendar.getInstance();
        calendarNotifiedTime1.set(Calendar.HOUR, dateTime1.getHourOfDay());
        calendarNotifiedTime1.set(Calendar.MINUTE, dateTime1.getMinuteOfHour());
        calendarNotifiedTime1.set(Calendar.SECOND, dateTime1.getSecondOfMinute());
        calendarNotifiedTime1.set(Calendar.AM_PM, Calendar.AM);

        final DateTime dateTime2 = DateTime.now();
        dateTime2.hourOfDay().setCopy(12);
        dateTime2.minuteOfHour().setCopy(30);
        dateTime2.secondOfMinute().setCopy(00);
        final Calendar calendarNotifiedTime2 = Calendar.getInstance();
        calendarNotifiedTime2.set(Calendar.HOUR, dateTime2.getHourOfDay());
        calendarNotifiedTime2.set(Calendar.MINUTE, dateTime2.getMinuteOfHour());
        calendarNotifiedTime2.set(Calendar.SECOND, dateTime2.getSecondOfMinute());
        calendarNotifiedTime2.set(Calendar.AM_PM, Calendar.PM);

        final DateTime dateTime3 = DateTime.now();
        dateTime3.hourOfDay().setCopy(6);
        dateTime3.minuteOfHour().setCopy(30);
        dateTime3.secondOfMinute().setCopy(00);
        final Calendar calendarNotifiedTime3 = Calendar.getInstance();
        calendarNotifiedTime3.set(Calendar.HOUR, dateTime3.getHourOfDay());
        calendarNotifiedTime3.set(Calendar.MINUTE, dateTime3.getMinuteOfHour());
        calendarNotifiedTime3.set(Calendar.SECOND, dateTime3.getSecondOfMinute());
        calendarNotifiedTime3.set(Calendar.AM_PM, Calendar.PM);


        Intent intent1 = new Intent(EmptyActivity.this, NotificationReceiver.class);
        intent1.putExtra(NotificationReceiver.NOTIFICATION_MESSAGE, "Repeat " + dateTime1.getHourOfDay() + ":" + dateTime1.getMinuteOfHour() + ":" + dateTime1.getSecondOfMinute());
        Intent intent2 = new Intent(EmptyActivity.this, NotificationReceiver.class);
        intent2.putExtra(NotificationReceiver.NOTIFICATION_MESSAGE, "Repeat " + dateTime2.getHourOfDay() + ":" + dateTime2.getMinuteOfHour() + ":" + dateTime2.getSecondOfMinute());
        Intent intent3 = new Intent(EmptyActivity.this, NotificationReceiver.class);
        intent3.putExtra(NotificationReceiver.NOTIFICATION_MESSAGE, "Repeat " + dateTime3.getHourOfDay() + ":" + dateTime3.getMinuteOfHour() + ":" + dateTime3.getSecondOfMinute());
        PendingIntent pendingIntent1 = PendingIntent.getBroadcast(EmptyActivity.this, REPEAT_NOTIFICATION1, intent3, PendingIntent.FLAG_UPDATE_CURRENT);
        PendingIntent pendingIntent2 = PendingIntent.getBroadcast(EmptyActivity.this, REPEAT_NOTIFICATION2, intent2, PendingIntent.FLAG_UPDATE_CURRENT);
        PendingIntent pendingIntent3 = PendingIntent.getBroadcast(EmptyActivity.this, REPEAT_NOTIFICATION3, intent3, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) this.getSystemService(ALARM_SERVICE);


                cancelNotification(REPEAT_NOTIFICATION1);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendarNotifiedTime1.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent1);
                cancelNotification(REPEAT_NOTIFICATION2);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendarNotifiedTime2.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent2);
                cancelNotification(REPEAT_NOTIFICATION3);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendarNotifiedTime3.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent3);
    }

取消通知:

 public void cancelNotification(int requestCode) {
            try {
                Intent notificationIntent = new Intent(getApplicationContext(), NotificationReceiver.class);
                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), requestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                AlarmManager alarmManager = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                alarmManager.cancel(pendingIntent);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

广播接收器:

   public class NotificationReceiver extends BroadcastReceiver {
    public static String NOTIFICATION_MESSAGE = "notificationMessage";
    public static int REPEAT_NOTIFICATION1 = 201;
    public static int REPEAT_NOTIFICATION2 = 202;
    public static int REPEAT_NOTIFICATION3 = 203;

    Context context;

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

        this.context = context;

        //Assume StartDate = yesterday.
        DateTime startDate = DateTime.now().minusDays(1);
        //Assume EndDate = tomorrow
        DateTime endDate = startDate.plusDays(2);

        DateTime today = DateTime.now();

        if (today.isBefore(endDate) || today.isEqual(endDate)) {

            String message = intent.getStringExtra(NOTIFICATION_MESSAGE);
            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            //Define sound URI
            Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

            Intent notificationIntent = new Intent(context, EmptyActivity.class);
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
            final DateTime dateTime = DateTime.now();
            int color = 0xffffaa00;
//        int color1 = context.getColor(R.color.notificatinBackgroundColor);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
            builder.setSmallIcon(R.drawable.festi_push_message_small);
            builder.setContentIntent(pendingIntent);
            builder.setContentTitle("Notification Sample");
            builder.setAutoCancel(true);
            builder.setContentText(message + ", Current Time : " + dateTime.getHourOfDay() + ":" + dateTime.getMinuteOfHour() + ":" + dateTime.getSecondOfMinute());
            builder.setSound(soundUri);
            builder.setLights(Color.RED, 1000, 1000);
            builder.setColor(color);

            Notification notification = builder.build();

            notification.flags |= Notification.FLAG_AUTO_CANCEL;

            notificationManager.notify(102938, notification);
        } else {
            cancelNotification(REPEAT_NOTIFICATION1);
            cancelNotification(REPEAT_NOTIFICATION2);
            cancelNotification(REPEAT_NOTIFICATION3);
        }
    }

    public void cancelNotification(int requestCode) {
        try {
            Intent notificationIntent = new Intent(context, NotificationReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Manifest.xml

  <receiver android:name=".NotificationReceiver" />

关于java - 在 Android 中针对事件的开始日期和结束日期设置特定时间的闹钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884050/

相关文章:

Java LIBGDX,从另一个类调用InputHandler的TouchDown方法

Java正则表达式后视组没有明显的最大长度错误

android - 用expo生成的apk安装时不要求权限

java - AlarmManager 未触发 onReceived

java - 不同语言(即 Java 和 C++)中的 "random"生成器如何比较?

java - Android - 在抽屉导航的Fragment中调用RecyclerView

android - android playstore 是否支持非续订订阅?

android - Alarmmanager.setRepeating 立即触发

java - 如何杀死所有未跟踪Android的警报管理器

java - 如何处理用户而不是处理 Ip-Addressing?