如何使用setExact设置每周重复闹钟的日历时间?

时间:2016-02-11 09:14:35

标签: java android datetime alarmmanager android-calendar

我正在使用闹钟管理器和广播接收器设置通知。我曾尝试使用警报管理器的setInexactRepeating方法,但它不会在API 19以上的确切时间发出警报。

所以我建议使用setExact方法并手动设置警报。我不知道怎么能这样做。我是否需要计算一年中每周的日期?

我如何设置每周同一天的时间?喜欢如果我已经为本周一的星期一设定了时间,我希望下周所有星期一都能收到警报。

我如何设定每周的时间?

以下是我设置闹钟的方法:

public void setNotificationTime(Calendar c)
{

    Date dateFrom = new Date();
    df = new SimpleDateFormat("E MMM dd hh:mm:ss zzzz yyyy");
    try {
        dateFrom = df.parse(startTime);
    }
    catch (ParseException ex) {

    }

    dateFrom.getTime();
    c.setTime(dateFrom);

    hour = c.get(Calendar.HOUR_OF_DAY);
    minute = c.get(Calendar.MINUTE);


    if(notificationTime.equals("10 Minutes Before"))
    {


        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute - 10);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        c.set(Calendar.DATE, day);
        // c.set(Calendar.DAY_OF_WEEK,);

        SetDay(c);

        notification = c.getTime();
        notificationTime = df.format(notification);

        Toast.makeText(getApplicationContext(),notificationTime,Toast.LENGTH_SHORT).show();

        intent = new Intent(getBaseContext(),NotificationReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0);
        alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent);

    }



    else if(notificationTime.equals("30 Minutes Before"))
    {

        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute - 30);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        c.set(Calendar.DATE, day);
        // c.set(Calendar.DAY_OF_WEEK,);

        SetDay(c);

        notification = c.getTime();
        notificationTime = df.format(notification);

        Toast.makeText(getApplicationContext(),notificationTime,Toast.LENGTH_SHORT).show();

        intent = new Intent(getBaseContext(),NotificationReceiver.class);
        pendingIntent = PendingIntent.getBroadcast(getBaseContext(),RQS_1, intent, 0);
        alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent);

    }
 }

我的尝试是使用for循环来获取下周的日期并设置闹钟。因此,循环将运行52次,即一年52周。

它将设置一年中每周的日期。但我只有下一个星期的日期,即如果今天是11岁,我的日期是18日。它不会进一步发展。这有什么不对?

 public void setDates(Calendar c)
{

    Date dateFrom = new Date();
    df = new SimpleDateFormat("E MMM dd hh:mm:ss zzzz yyyy");
    try {
        dateFrom = df.parse(startTime);
    }
    catch (ParseException ex) {

    }

    c.setTime(dateFrom);

    hour = c.get(Calendar.HOUR_OF_DAY);
    minute = c.get(Calendar.MINUTE);

    dateFrom.getTime();
    Date setDate = new Date();

    SetDay(c);

    Date changeDate = new Date();

    for(int i=0;i<=52;i++) {

        setDate.setTime(changeDate.getTime());

        c.set(Calendar.HOUR_OF_DAY, hour);
        c.set(Calendar.MINUTE, minute - 10);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        c.set(Calendar.DATE, day + 7);
        // c.set(Calendar.DAY_OF_WEEK,);

      //  c.setTime(setDate);

        notification = c.getTime();
        notificationTime = df.format(notification);

        changeDate.setTime(notification.getTime());

        Log.i("changedate",String.valueOf(changeDate));

        Log.i("dates",notificationTime);

    }

}

谢谢..

1 个答案:

答案 0 :(得分:1)

请选择不精确的重复来帮助用户节省电量。这就是Android不希望您设置精确重复警报的原因 - 它可能会非常快地耗尽电池。

如果您必须完全重复,则必须设置准确的警报,然后在触发时,在下次需要时注册另一个新的确切警报。只要你需要,重复这个。