【问题标题】:Android multiple alarms not workingAndroid多个警报不起作用
【发布时间】:2018-03-05 18:06:44
【问题描述】:
public static boolean setupAlarm(String flightName, long columnId, int time,int requestCode, Context context) {
    AlarmManager alarmManager;


    FlightTimeObject timeObject = DataCheckingUtils.getConvertedTime(time);

    try {
        alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        Intent intent = new Intent(context.getApplicationContext(), ProcessAlarmReceiver.class);
        intent.putExtra(IntentActions.INTENT_REQUEST_CODE, requestCode);
        intent.putExtra(IntentActions.INTENT_SEND_STRING_FLIGHT, flightName);
        intent.putExtra(IntentActions.INTENT_SEND_FLIGHT_COLUMN_ID, columnId);


        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent,0);

        //Get calendar instance
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());

        //get hour
        if (timeObject.getHour()!= -1) {
            int hour = timeObject.getHour();
            calendar.set(Calendar.HOUR_OF_DAY, hour);
        }

        //get minute
        if (timeObject.getMinute()!=-1){
            int minute = timeObject.getMinute();
            calendar.set(Calendar.MINUTE, minute);
        }

        calendar.set(Calendar.SECOND, 0);

        assert alarmManager != null;

        alarmManager.setExact(AlarmManager.RTC_WAKEUP,
                calendar.getTimeInMillis(),
                pendingIntent);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

大家好。上面的代码在下面的 for 循环中被调用。

private static void setupAlarmToFlight(ArrayList<FlightObject> flightArray, Context context) {


    int numberOfAlarms = 0;
    int requestCode = 0;

    for (int i = 0; i < flightArray.size(); i++){
        FlightObject flight = flightArray.get(i);
        String name = flight.getFlightName();
        long flightColumnId = flight.getColumnId();
        int flightActualTime = flight.getActualArrivalTime();
        int scheduledTime = flight.getFlightScheduledTime();
        int timeToParse =  -2;
        if (flightActualTime == -2){
            timeToParse = scheduledTime;
        }else{
            timeToParse = flightActualTime;
        }
        boolean alarmSet = ExtractFlightUtilities.setupAlarm(
                name,
                flightColumnId,
                timeToParse,
                requestCode,
                context);

        if (alarmSet){
            numberOfAlarms++;
            requestCode++;
        }
    }
        Intent intent = new Intent(IntentActions.ALARM_SET);
        intent.putExtra(IntentActions.INTENT_SEND_INT, numberOfAlarms);
        context.sendBroadcast(intent);
}

此代码基本上为将启动服务的数组列表中的不同航班到达时间设置警报。第一个警报总是准时响起,但其余的永远不会响起。我什至停止了服务,所以它只会到达接收器,但只有第一次触发。我还在 2-3 个警报时停止了 for 循环,但没有。

我确保小时和分钟设置正确,并使用了另一个循环,该循环只会在每次后一分钟内设置警报,但没有运气。

任何帮助将不胜感激。

已编辑:

我尝试了这个建议,但仍然没有发出警报。
我注意到一些有趣的事情,在设置断点时,调试器会提供预览值,并且第一个响起的警报正常,它的值,例如 requestCode 和 Calendar 值是绿色的。以下所有其他警报均为红色。

第一次报警。 请求代码为绿色。

待处理的意图看起来都是绿色的。

日历值看起来都是绿色的。

对于所有其他警报。

请求代码为红色。

待处理的意图请求代码红色:

日历值为红色

再次感谢您的宝贵时间。

【问题讨论】:

    标签: android alarmmanager


    【解决方案1】:

    由于您设置了准确的时间,可能是因为您没有检查设置的闹钟时间是否尚未过去。例如。考虑当前日期/时间是1-Jan-2018 11:30PM。如果您为01:00AM 设置闹钟,根据您的代码,闹钟将为1-Jan-2018 01:00AM 设置,因为您使用了:

    calendar.setTimeInMillis(System.currentTimeMillis())
    

    它返回 1-Jan-2018 11:30PM 并且您将时间设置为 01:00AM 将日期更改为 1-Jan-2018 01:00AM 已通过。在这种情况下,您应该添加一天的警报日期。像这样的:

    /**
     * adjust time and date of alarm (alarms set in some previous years, will updated to today).
     * if time is passed in today, date will +1
     *
     * @param alarmTimeCalendar time which may need adjustments
     * @return adjusted time for alarm
     */
    public static Calendar adjustAlarmTime(Calendar alarmTimeCalendar) {
        Calendar adjustedDateCalendar = Calendar.getInstance();
        int hour = alarmTimeCalendar.get(Calendar.HOUR_OF_DAY);
        int minute = alarmTimeCalendar.get(Calendar.MINUTE);
        adjustedDateCalendar.set(Calendar.HOUR_OF_DAY, hour);
        adjustedDateCalendar.set(Calendar.MINUTE, minute);
        adjustedDateCalendar.set(Calendar.SECOND, 0);
        Date currentDate = adjustedDateCalendar.getTime();
        Date alarmDate = adjustedDateCalendar.getTime();
        long difference = alarmDate.getTime() - currentDate.getTime();
        if (difference < 0) {
            adjustedDateCalendar.add(Calendar.DATE, 1);
        }
        return adjustedDateCalendar;
    }
    

    【讨论】:

    • 谢谢您,我会尝试您的建议,然后回复您。再次感谢您。
    • 谢谢你,我通过你的方法传了日历,还是一样。我注意到几个红色值不会导致调试器出现任何错误或崩溃。我用更多信息编辑了 OP,谢谢。 @VSB
    【解决方案2】:

    所以在尝试了多种解决问题的方法后,我通过将警报设置为仅 RTC 而不是 RTC_WAKEUP 来解决它。现在所有的警报都按时响起。

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多