Dobbiamo scegliere l'allarme giusto.
Di ambedue ci sarebbe una versione "wakeup" che se ho ben capito "sveglia" la CPU quando il telefono è in standby, e se si sceglie la versione "non wakeup" l'allarme scatterebbe solo se il cellulare è acceso.
Quindi esistono quattro tipi di allarme (diamo anche la definizione "tecnica"):
- ELAPSED_REALTIME è quello che dà l'allarme ogni "tot" di tempo, ma non "sveglia" il cellulare;
- ELAPSED_REALTIME_WAKEUP è un ELAPSED_REALTIME che sveglia il cellulare;
- RTC è basato sull'ora locale e non sveglia il cellulare;
- RTC_WAKEUP è basato sull'ora locale ma sveglia il cellulare.
Passiamo agli esempi, per i quali dovrò andare divagando un po'...
Ecco: mi fa iniziare dichiarando un AlarmManager e un PendingIntent.
Poi mi fa istanziare AlarmManager mediante context.getSystemService()
AlarmManager alarmMgr; PendingIntent alarmIntent; alarmMgr=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);Il pending intent mi servirà fra poco...
Intanto definiamo un Intent, ossia quello che si vuole accada allo scadere del tempo (credo):
AlarmManager alarmMgr; PendingIntent alarmIntent; alarmMgr=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE); Intent intent=new Intent(this,Seconda.class);Per l'occasione ho dovuto creare una seconda Activity, che ho chiamato, appunto, "Seconda".
Ecco, adesso si profila il PendingIntent, con il quale non ho una gran confidenza.
Vado a cercarmi la documentazione per il PendingIntent...
Ecco: il metodo getBroadcast per il PendingIntent dovrebbe essere simile a quando, con un semplice Intent, si scrive sendBroadcast.
Mi riservo una sessione di esercizio con gli Intent in Broadcast, perché ne ho bisogno.
Scriviamo il codice del PendingIntent che ingloba l'Intent...
AlarmManager alarmMgr; PendingIntent alarmIntent; alarmMgr=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE); Intent intent=new Intent(this,Seconda.class); alarmIntent=PendingIntent.getBroadcast(this, 0, intent, 0);Bene: abbiamo istanziato un AlarmManager, quindi abbiamo definito un Intent e lo abbiamo inglobato in un PendingIntent.
Ora definiamo l'ora. Non ho molta confidenza in questo.
Viene creato un Calendario...
Sulla creazione del calendario, non mi pare che ci siano molti problemi.
Calendar cal=Calendar.getInstance();Piuttosto quel metodo setTimeInMillis non lo conosco: l'ho intravisto varie volte e non l'ho mai capito né approfondito. Adesso è il caso di approfondire...
Se ho ben capito, esprime il numero di millisecondi che decorrono da un certo periodo, che a quanto ho capito dovrebbe chiamarsi Epoch. Ma che cos'è l'Epoch?
Ecco, dopo aver immaginato cosa possa significare, ossia il numero di millisecondi dal 1/1/1970, voglio verificare.
Mi predispongo una linea di codice che mi mostri il valore di System.currentTimeMillis(), il quale dovrebbe essere il numero di millisecondi dell'ora attuale da quella data...
AlarmManager alarmMgr; PendingIntent alarmIntent; alarmMgr=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE); Intent intent=new Intent(this,Seconda.class); alarmIntent=PendingIntent.getBroadcast(this, 0, intent, 0); Calendar cal=Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); Log.v("TEMPO",System.currentTimeMillis());Ecco: ho ottenuto questo:
06-10 14:05:08.967: V/TEMPO(12543): 1465560308977Ora dividiamolo per 1000 e otteniamo i secondi, quindi per 3600, per 24 e otteniamo i giorni...
Senza stare ad adattare i decimali al sistema di misurazione non decimale del tempo, ottengo all'incirca 46 anni, che corrisponde all'anno 1970, come avevo letto.
Bene. Quindi il tempo del calendario è stato regolato, in millisecondi, al tempo trascorso dall'inizio del 1970 a oggi.
Andiamo avanti...
Adesso si setta l'ora... e poi il minuto.
Calendar cal=Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); cal.set(Calendar.HOUR_OF_DAY, 14); cal.set(Calendar.MINUTE, 20);E ora si setta AlarmManager.
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000*60*5, alarmIntent);Attendiamo... Alla fine, ha funzionato, sia pure con qualche difetto: non mi mostrava l'activity in tutti i casi, ma ogni 5 minuti mi mostrava l'activity principale dell'app. La cosa va sviscerata.
Nessun commento:
Posta un commento