首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >告警管理器不是每天都触发

告警管理器不是每天都触发
EN

Stack Overflow用户
提问于 2016-08-04 15:08:03
回答 1查看 1.2K关注 0票数 0

在我的项目中,我需要安排一个任务,以便在每天的特定时间显示通知。如果我将它设置为今天的某个时间,它会触发,一切都会按预期进行,但如果计划时间是明天,它就不会触发。下面是我设置闹钟管理器的代码。

代码语言:javascript
复制
public void setMorningRepeatingTask(Context context, int hour, int minutes) {
        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
        intent.setAction(Constants.ALARM_MANAGER_INTENT_MORNING_UNIQUE_ACTION);
        alarmIntent = PendingIntent.getBroadcast(context, Constants.MORNING_ALARM_UNIQUE_ID, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minutes);
        if(checkIfTheTimeHasPassed(calendar.getTimeInMillis())){
            calendar.add(Calendar.DATE, 1);
        }
        alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, alarmIntent);
        FileLogger.writeToFile("Alarm Set", "Morning repeating Alarm Set");
    }

public static boolean checkIfTheTimeHasPassed(long timeInMillis) {
        long nowTime = new Date().getTime();
        return nowTime > timeInMillis;
    }

请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-07 03:19:22

最后,我找到了解决我面临的问题的办法。我使用alarmMgr.set()方法而不是alarmMgr.setRepeating(),当闹钟响起时,我为第二天设置了另一个闹钟。以这种方式,它将日复一日地重复。:)

我仍然想知道alarmMgr.setRepeating()方法出了什么问题。所以,如果任何人有任何想法,请张贴解决方案。

下面是我实现的代码。

代码语言:javascript
复制
public void setMorningRepeatingTask(Context context, int hour, int minutes, boolean forceScheduleNextDay) {
        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
        intent.putExtra(Constants.KEY_ALARM_TIME, Constants.VALUE_MORNING_ALARM);
        alarmIntent = PendingIntent.getBroadcast(context, Constants.MORNING_ALARM_UNIQUE_ID, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minutes);
        if (Utility.checkIfTheTimeHasPassed(calendar.getTimeInMillis()) || forceScheduleNextDay) {
            calendar.add(Calendar.DATE, 1);
        }
        alarmMgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), alarmIntent);
        Log.i("Morning Alarm", "Alarm is set for " + calendar.get(Calendar.DATE) + " at "
                + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE));
        FileLogger.writeToFile("Alarm Set", "Morning repeating Alarm Set");
        FileLogger.writeToFile("Morning Alarm", "Alarm is set for " + calendar.get(Calendar.DATE) + " at "
                + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE));
    }

以上方法用于设置闹钟。

代码语言:javascript
复制
if (Utility.checkIfTheTimeHasPassed(calendar.getTimeInMillis()) {
   calendar.add(Calendar.DATE, 1);
}

public static boolean checkIfTheTimeHasPassed(long timeInMillis) {
    long nowTime = new Date().getTime();
    return nowTime > timeInMillis;
}

上述条件将检查时间是否已过,如果已过,则将告警安排在第二天。

告警触发时,会调用BroadcastReceiver子类的onReceive()方法。

代码语言:javascript
复制
@Override
 public void onReceive(Context context, Intent intent) {
    FileLogger.writeToFile("Alarms rang off!!", "Alarm rang");

    //Add your logic here

    setMorningRepeatingTask(context,morningTimeCalender.get(Calendar.HOUR_OF_DAY), morningTimeCalender.get(Calendar.MINUTE), true);
}

在这个方法中,在做完我想在闹铃上做的事情之后,我用同样的方法重新安排了第二天的闹钟。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38760634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档