Autore Topic: AlarmManager.cancel(), quando?  (Letto 901 volte)

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
AlarmManager.cancel(), quando?
« il: 22 Ottobre 2011, 20:18:21 CEST »
0
ciao a tutti,
personalmente non sono riuscito a trovare una risposta al seguente quesito.

creo un PendingIntent e setto un alarm tramite AlarmManager;
alla ricezione, devo cancellare l'alarm esplicitamente oppure, in quanto "scaduto", si è cancellato automaticamente?

a me verrebbe da pensare di sì anche se mi sembra proprio di no :)

che mi sapete dire?
grazie mille!

Offline funcool

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid CM 7.1
  • Play Store ID:
    elcasa
  • Sistema operativo:
    Windows 8
Re:AlarmManager.cancel(), quando?
« Risposta #1 il: 22 Ottobre 2011, 21:09:27 CEST »
+2
l'allarme una volta scattato si cancella da solo,  con il cancel elimini quelli che devono ancora scattare, o quelli già scattati ma che hanno la ripetizione

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:AlarmManager.cancel(), quando?
« Risposta #2 il: 23 Ottobre 2011, 18:28:15 CEST »
0
ciao e grazie della risposta.

l'allarme una volta scattato si cancella da solo,  con il cancel elimini quelli che devono ancora scattare, o quelli già scattati ma che hanno la ripetizione

bè, sì... anch'io mi aspetterei questo comportamento ma non è quello che ottengo.

questo è il mio codice:

Codice (Java): [Seleziona]
public static void setAlarmManagerEvent(Context context, Class<?> clazz, Calendar calendar) {
        Intent intent = new Intent(context, clazz);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}

public static boolean isAlarmManagerEventSet(Context context, Class<?> clazz) {
        Intent intent = new Intent(context, clazz);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);

        if (pendingIntent != null) return true;
        return false;
}

public static void cancelAlarmManagerEvent(Context context, Class<?> clazz) {
        Intent intent = new Intent(context, clazz);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
}

questo l'utilizzo:
  • chiamo setAlarmManagerEvent() passandogli la classe AlarmReceiver;
  • verifico che isAlarmManagerEventSet() mi restituisca true;
  • alla scadenza dell'alarm, AlarmReceiver viene correttamente chiamato;
  • adesso isAlarmManagerEventSet() continua a restituirmi true.
altresì, dopo aver esplicitamente chiamato cancelAlarmManagerEvent(), isAlarmManagerEventSet() restituisce false...

grazie mille per eventuali indicazioni e suggerimenti.
« Ultima modifica: 23 Ottobre 2011, 19:49:25 CEST da lo »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:AlarmManager.cancel(), quando?
« Risposta #3 il: 23 Ottobre 2011, 19:53:15 CEST »
0
Ironia della sorte, è una cosa che stavo provando anche io la settimana scorsa. Purtroppo questo comportamento è del tutto corretto, cioè la tua isAlarmManagerEventSet() cerca di sopperire alla mancanza di funzioni per capire se un pendingIntent è sempre pending, ma in realtà ti dice solo se esiste, a prescindere se sia o meno scaduto.

Un modo per salvare capra e cavoli è questo: quando l'allarme suona, fagli anche eseguire la cancel, così facendo la tua isAlarmManagerEventSet ritornerà correttamente false.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:AlarmManager.cancel(), quando?
« Risposta #4 il: 23 Ottobre 2011, 20:10:51 CEST »
0
Ironia della sorte, è una cosa che stavo provando anche io la settimana scorsa. Purtroppo questo comportamento è del tutto corretto, cioè la tua isAlarmManagerEventSet() cerca di sopperire alla mancanza di funzioni per capire se un pendingIntent è sempre pending, ma in realtà ti dice solo se esiste, a prescindere se sia o meno scaduto.

Un modo per salvare capra e cavoli è questo: quando l'allarme suona, fagli anche eseguire la cancel, così facendo la tua isAlarmManagerEventSet ritornerà correttamente false.

ok, quindi un alarm non si cancella da solo alla scadenza!

@funcool: per completezza, gradirei capire meglio la tua esperienza, grazie.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:AlarmManager.cancel(), quando?
« Risposta #5 il: 23 Ottobre 2011, 20:16:57 CEST »
0
sono stato impreciso, quello che devi esplicitamente cancellare è il PendingIntent, perchè continua ad esistere anche dopo che l'allarme è suonato.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline lo

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus one
Re:AlarmManager.cancel(), quando?
« Risposta #6 il: 23 Ottobre 2011, 20:35:45 CEST »
0
sono stato impreciso, quello che devi esplicitamente cancellare è il PendingIntent, perchè continua ad esistere anche dopo che l'allarme è suonato.

quindi una cosa del genere:

Codice (Java): [Seleziona]
public static void onAlarmManagerEventExpired(Context context, Class<?> clazz) {
        Intent intent = new Intent(context, clazz);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        pendingIntent.cancel();
}

grazie, proverò.

Offline funcool

  • Nuovo arrivato
  • *
  • Post: 42
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Acer Liquid CM 7.1
  • Play Store ID:
    elcasa
  • Sistema operativo:
    Windows 8
Re:AlarmManager.cancel(), quando?
« Risposta #7 il: 26 Ottobre 2011, 19:03:43 CEST »
0
ok, quindi un alarm non si cancella da solo alla scadenza!

@funcool: per completezza, gradirei capire meglio la tua esperienza, grazie.

la mia esperienza non credo ti serva a tanto.. è questa:

Codice (Java): [Seleziona]
AlarmManager alMan = (AlarmManager)getSystemService(ALARM_SERVICE);
                                               
                Intent setIn = new Intent(myCont, a.class);    
       
                Intent clearIn = new Intent(myCont, b.class);
               
                // Create an IntentSender that will launch our service, to be scheduled
              // with the alarm manager.
               
                startAlarmSender = PendingIntent.getService(myCont,
                      0, setIn, 0);
                                               
                endAlarmSender = PendingIntent.getService(myCont,
                      0, clearIn, 0);
                 
               
                // delete old alarms
                alMan.cancel(startAlarmSender);
                alMan.cancel(endAlarmSender);
               
                alMan.set(AlarmManager.RTC_WAKEUP, startCal.getTimeInMillis() , startAlarmSender);
                alMan.set(AlarmManager.RTC_WAKEUP, endCal.getTimeInMillis() , endAlarmSender);
                       
                Toast.makeText(myCont, "ScheduleAlarm: Alarm Set", Toast.LENGTH_LONG).show();
               
                stopSelf();    

il cancel mi serve solo per gli allarmi non ancora scattati, in caso cioè che l'utente abbia cambiato impostazioni degli orari prima che siano scattati tutti e 2

Offline salvatore.zagarella

  • Utente normale
  • ***
  • Post: 239
  • Respect: +2
    • Mostra profilo
    • Ieeng Solution
Re:AlarmManager.cancel(), quando?
« Risposta #8 il: 19 Novembre 2011, 10:49:31 CET »
0
Scusate ragazzi.. realizzando la mia sveglia mi sono accorto che, qnd l'applicazione viene "killata" dal sistema, allora l'allarme nn si attiva più... mentre se l'app resta in beckground allora va tutto ok..

Sbaglio io qualcosa?Come si può rimediare??

Offline salvatore.zagarella

  • Utente normale
  • ***
  • Post: 239
  • Respect: +2
    • Mostra profilo
    • Ieeng Solution
Re:AlarmManager.cancel(), quando?
« Risposta #9 il: 19 Novembre 2011, 10:55:33 CET »
0
Ecco un pezzo di codice..

Codice (Java): [Seleziona]
AlarmManager myAlarm;
........

PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(), id, alarmActive, PendingIntent.FLAG_UPDATE_CURRENT);                                

myAlarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
myAlarm.set(AlarmManager.RTC_WAKEUP, TIME_OF_ALARM, sender);

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:AlarmManager.cancel(), quando?
« Risposta #10 il: 19 Novembre 2011, 11:32:28 CET »
0
Scusate ragazzi.. realizzando la mia sveglia mi sono accorto che, qnd l'applicazione viene "killata" dal sistema, allora l'allarme nn si attiva più... mentre se l'app resta in beckground allora va tutto ok..

L'allarme resta settato anche quando chiudi l'app. Viene resettato solo quando spegni il telefono.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline salvatore.zagarella

  • Utente normale
  • ***
  • Post: 239
  • Respect: +2
    • Mostra profilo
    • Ieeng Solution
Re:AlarmManager.cancel(), quando?
« Risposta #11 il: 19 Novembre 2011, 11:55:42 CET »
0
Allora sbaglio qualcosa perchè qnd chiudo l'applicazione dal "Gestore Attività" o qnd il sistema killa il processo, l'allarme non scatta.. quel pezzetto di codice che ho postato è corretto?

Grazie e scusa il disturbo..

Offline salvatore.zagarella

  • Utente normale
  • ***
  • Post: 239
  • Respect: +2
    • Mostra profilo
    • Ieeng Solution
Re:AlarmManager.cancel(), quando?
« Risposta #12 il: 19 Novembre 2011, 13:30:01 CET »
0
io nel manifest ho inserito questo
Codice: [Seleziona]
<receiver android:name="mia.app.alarm.alarmReceiver" android:process=":remote" />
Però se l'app è chiusa dal task, allora non si attiva..

Offline salvatore.zagarella

  • Utente normale
  • ***
  • Post: 239
  • Respect: +2
    • Mostra profilo
    • Ieeng Solution
Re:AlarmManager.cancel(), quando?
« Risposta #13 il: 19 Novembre 2011, 15:01:03 CET »
0
Se volete vi posto tutto il blocco in cui setto l'alarm..non riesco a capire xkè non fuinzioni...
 :'(