【问题标题】:Android : How to use same AlarmManager in loop?Android:如何在循环中使用相同的 AlarmManager?
【发布时间】:2018-05-15 09:39:12
【问题描述】:

我写了下面的报警方法。

 public void alarm(int time){
    Intent intent = new Intent(MainActivity.this, Alarm.class);

    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0 , intent, 0);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+time*1000, pi);
}

这种方法效果很好。但是当我多次调用该方法时出现问题。喜欢,

alarm(10);
alarm(50);

这次它只调用alarm(10);,但不调用alarm(50);

请大家帮忙看看为什么会出现这个问题!

【问题讨论】:

    标签: java android alarmmanager alarm


    【解决方案1】:

    您的PendingIntent 在您调用您的方法时具有相同的属性。当您第二次调用PendingIntent.getBroadcast() 时,它将返回第一次创建的PendingIntent

    如果您希望警报触发两次,您需要执行以下操作:

    public void alarm(int time, int requestCode){
        Intent intent = new Intent(MainActivity.this, Alarm.class);
    
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), requestCode , intent, 0);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+time*1000, pi);
    }
    

    然后这样称呼它:

    alarm(10, 0);
    alarm(50, 1);
    

    【讨论】:

    • 您好 Sander,非常感谢您的回复,这是一个非常有用的代码。你救了我的命,我在工作中遇到了麻烦,但你是我的英雄。再次感谢!
    【解决方案2】:

    您提供相同的 ID (0) 您需要使用不同的唯一 ID。像这样使用不同的待处理意图 id。您可以使用毫秒作为 id。

    public void alarm(int time, int requestCode){
        Intent intent = new Intent(MainActivity.this, Alarm.class);
        Long timeToMilliSeconds = timeToMilliSeconds(hour, minute);
    
        AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), timeToMilliSeconds , intent, 0);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+time*1000, pi);
    }
    

    【讨论】:

    • 如果有效,则将其标记为答案并放弃投票
    • 已经有人给出了这个答案。这就是为什么我不能给你正确的答案。但这也很有帮助。谢谢。
    【解决方案3】:

    您将相同的 ID 0PendingIntent::getBroadcast 中的第二个参数)提供给多个PendingIntent。这是你的错。

    根据您设置的FLAG,行为可能会有所不同。

    考虑为每个PEstandard flags 之一使用不同的ID。

    另见:

    【讨论】:

      【解决方案4】:
      // context variable contains your `Context`
      AlarmManager mgrAlarm = (AlarmManager) context.getSystemService(ALARM_SERVICE);
      ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
      
      for(i = 0; i < 10; ++i)
      {
         Intent intent = new Intent(context, OnAlarmReceiver.class);
         // Loop counter `i` is used as a `requestCode`
         PendingIntent pendingIntent = PendingIntent.getBroadcast(context, i, intent, 0);
         // Single alarms in 1, 2, ..., 10 minutes (in `i` minutes)
         mgrAlarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
                      SystemClock.elapsedRealtime() + 60000 * i, 
                      pendingIntent); 
      
         intentArray.add(pendingIntent);
      }
      

      【讨论】:

        【解决方案5】:

        这样称呼

        alarm(10, 0);
        alarm(50, 1);
        

        对于多个 Pendingintent,它需要不同的 id,因此在调用者方法中传递 不同的id。

        【讨论】:

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