Android: как использовать один и тот же AlarmManager в цикле? - PullRequest
0 голосов
/ 15 мая 2018

Я пишу ниже метод для тревоги.

 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);

Кто-нибудь, пожалуйста, помогите, почему он показывает эту проблему!

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

Вы даете тот же идентификатор (0) Вам нужно использовать другой уникальный идентификатор. используйте другой ожидающий намеренный идентификатор как это. Вы можете использовать миллисекунды в качестве идентификатора.

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);
}
0 голосов
/ 15 мая 2018

Ваш 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);
0 голосов
/ 15 мая 2018
// 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);
}
0 голосов
/ 15 мая 2018

Вы даете один и тот же идентификатор 0 (второй параметр в PendingIntent::getBroadcast) более чем одному PendingIntent. Это твоя ошибка.

В зависимости от установленного FLAG поведение может отличаться.

Рассмотрите возможность использования разных идентификаторов для каждого PE или одного из стандартных флагов .

Также см .:

...