2011-08-31 12 views
9

Sto facendo una piccola applicazione dove devo impostare allarme dalla matrice, ma solo un allarme è impostato e di lavoro in un momento che è in ultima posizione dell'array il motivo per cui si comporta in questo modo che segue è il mio codiceCome impostare più di un allarme alla volta in Android?

AlarmManager[] alarmManager=new AlarmManager[24]; 
       for(f=0;f<arr2.length;f++) 
       { 
        Intent intent = new Intent(AlarmR.this, Riciving.class); 
        pi=PendingIntent.getBroadcast(AlarmR.this, 0,intent, 0); 

        alarmManager[f] = (AlarmManager) getSystemService(ALARM_SERVICE); 
        alarmManager[f].set(AlarmManager.RTC_WAKEUP,arr2[f] ,pi); 

        } 

Grazie in anticipo

+0

è possibile utilizzare questo [Più di un allarme] (http://www.satyakomatineni.com/akc/display?url=displaynoteimpurl&ownerUserId=satya&reportId=3503) – Uttam

+0

@Uttam Utils.getTimeAfterInSecs (45); non funziona perché non esiste alcuna classe interna Utils, quindi come posso ottenere lo stesso – Nitin

+0

Ciao, per favore, puoi postare il codice completo con il ricevitore Allarme multiplo allo stesso tempo .. –

risposta

22

Su pendingIntent è necessario impostare il secondo requestCode su un numero univoco. Di solito eseguo l'array attraverso un ciclo for e imposta il codice di richiesta in modo dinamico per ogni elemento dell'array. Senza lo requestCode gli allarmi si sovrascrivono.

AlarmManager[] alarmManager=new AlarmManager[24]; 
intentArray = new ArrayList<PendingIntent>(); 
for(f=0;f<arr2.length;f++){ 
    Intent intent = new Intent(AlarmR.this, Riciving.class); 
    pi=PendingIntent.getBroadcast(AlarmR.this, f,intent, 0); 

    alarmManager[f] = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager[f].set(AlarmManager.RTC_WAKEUP,arr2[f] ,pi); 

    intentArray.add(pi); 

} 

In sostanza, si vuole solo cambiare requestCode ad un numero dinamico. Impostandolo su f, gli viene assegnato un nuovo ID univoco per ogni elemento dell'array. Tieni presente che, se desideri annullare gli allarmi, dovrai utilizzare un altro per il ciclo e annullarli singolarmente. Personalmente aggiungo tutti i miei allarmi al proprio array in modo da poterli gestire separatamente.

Poi, se si ha bisogno di cancellare loro:

private void cancelAlarms(){ 
    if(intentArray.size()>0){ 
     for(int i=0; i<intentArray.size(); i++){ 
      alarmmanager.cancel(intentArray.get(i)); 
     } 
     intentArray.clear(); 
    } 
} 
+0

puoi darmi del codice – Nitin

+0

I aggiorna la mia risposta con un po 'di codice. Tenete a mente, questo non va d'accordo con la documentazione. Ho dovuto occuparmene non molto tempo fa su un progetto a cui sto lavorando. – ryandlf

+5

Perché la matrice di AlarmManager-s? – KarolDepka

3

Se si desidera impostare allarmi multipli (ripetizione o singola), allora non vi resta che creare i loro PendingIntents con diversi requestCode. Se requestCode è lo stesso, il nuovo allarme sovrascriverà quello vecchio.

Ecco il codice per creare più allarmi singoli e tenerli in ArrayList. Tengo PendingIntent nell'array perché quello che ti serve per cancellare la sveglia. variabile // contesto contiene il 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); 
} 
Problemi correlati