【问题标题】:Why is my android alarm manager firing instantly?为什么我的 android 警报管理器会立即触发?
【发布时间】:2010-07-29 02:06:43
【问题描述】:

我正在按照示例代码每 10 秒发送一次更新通知。代码如下,它位于UpdateService 中,对应AppWidgetProvider。如果我输入Thread.sleep(10*1000);,我可以看到我的服务循环的预期行为。我显然有一些根本性的错误会立即触发。它应该是一个警报的PendingIntent,它将向我的听众广播更新。

long nextUpdate = 10*1000;
Log.d(TAG, "Requesting next update in " + nextUpdate + " msec." );

Intent updateIntent = new Intent(ACTION_UPDATE_ALL);
updateIntent.setClass(this, UpdateService.class);

PendingIntent pendingIntent = PendingIntent.getService(this, 0, updateIntent, 0);

// Schedule alarm, and force the device awake for this update
AlarmManager alarmManager = (AlarmManager)getBaseContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 
    nextUpdate, pendingIntent);

【问题讨论】:

    标签: android alarmmanager android-appwidget android-pendingintent


    【解决方案1】:

    AlarmManager.setRepeating 被定义为public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) 第二个参数是它应该第一次被调用的时间。您告诉它从SystemClock.elapsedRealtime() 开始,即现在。

    【讨论】:

    • 感谢我的 +1 快速准确的回答。进入下一个问题。具有讽刺意味的是,我试图过早(
    • 我正在这样做amAlarm1.setInexactRepeating(AlarmManager.RTC_WAKEUP, 120000, AlarmManager.INTERVAL_DAY, alarm1Pending); still pending intent is firing instantly??
    • @MuhammadBabar:你真的应该发布一个新问题。但是无论如何要回答您的问题,您要将120000 传递给triggerAtTime,它对应于Fri, 02 Jan 1970 09:20:00 GMT
    • @Falmarri 感谢提供此新信息(任何方式 120000 仅用于测试),但问题是 InexactRepeating,它不能保证在用户定义的触发器上运行,我使用了setRepeating,它就像它应该的魅力一样工作:)
    • 我什至没有使用 setRepeating 或 setInexactRepeating 并且我的警报仍然会立即响起。
    【解决方案2】:

    您告诉setRepeating(),您希望第一个警报立即响起 (SystemClock.elapsedRealtime())。如果您希望第一个警报在其他时间响起,请添加偏移量 (SystemClock.elapsedRealtime()+nextUpdate)。

    【讨论】:

    • 感谢我的 +1 快速准确的回答。继续下一个问题。
    • 您可以使用 System.currentTimeMillis() +nextUpdate。
    • @Suresh:问题中的代码使用AlarmManager.ELAPSED_REALTIME。为此,您需要使用SystemClock.elapsedRealtime() 作为时基。如果要使用System.currentTimeMillis()作为时基,则需要使用AlarmManager.RTC作为报警类型。
    【解决方案3】:

    如果您正在为过去的时间创建 PendingIntent 警报,它将立即被触发。示例 - 为今天上午 8 点安排警报,但在上午 11 点左右执行代码将立即触发。

    解决办法:

    cal.add(Calendar.DATE, 1);
    
    long delay = 24 * 60 * 60 * 1000;
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);` 
    

    这将在第二天的指定时间(即上午 8 点)触发事件;

    【讨论】:

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