【问题标题】:AlarmManager Fires ImmediatelyAlarmManager 立即触发
【发布时间】:2015-11-06 06:43:54
【问题描述】:

我正在使用此代码,并且我的 AlarmManager 会立即触发,因为触发时间还有触发时间。我将其打印在 LOG 上,以便您查看。

public void SetAlarm(Context context, Date date, List<String> temp) {

    Log.d("Alarm Set", "Entered");
    Log.d("Alarm Set", date.getHours() + " " + date.getMinutes());

    AlarmManager am = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);

    Intent i = new Intent(context, Alarm.class);
    i.putStringArrayListExtra("list", (ArrayList<String>) temp);

    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i,
            PendingIntent.FLAG_ONE_SHOT);
    date.setMinutes(date.getMinutes() - 5);

    Calendar rightNow = Calendar.getInstance();
    long offset = rightNow.get(Calendar.ZONE_OFFSET)
            + rightNow.get(Calendar.DST_OFFSET);
    long sinceMidnight = (rightNow.getTimeInMillis() + offset)
            % (24 * 60 * 60 * 1000);

    long time_in_milis = (1000 * 60 * ((date.getHours() * 60) + date
            .getMinutes())) - sinceMidnight;
    Log.d("Alarm Time in Mili Seconds", "" + time_in_milis);

    am.set(AlarmManager.RTC_WAKEUP, time_in_milis * 10000, pi);
}

【问题讨论】:

  • 我没有真正看到你的问题
  • 你的日志说...?

标签: android android-service alarmmanager android-alarms


【解决方案1】:

如果我正确阅读了您的代码,则您将 time_in_milis [原文如此] 计算为时差,即您想要的与“现在”相关的时间。但是,set() 需要一个绝对时间戳。

换句话说,您提供的时间戳非常低,有效地安排了过去的警报。

对于一个简单的测试场景,请尝试通过System.currentTimeMillis() + 60000 - 您的警报应该会在大约一分钟后触发(请记住set() 设置了不准确的警报)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多