Autore Topic: AlarmManager  (Letto 4797 volte)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
AlarmManager
« il: 13 Gennaio 2011, 22:17:27 CET »
0
Ho implementato questo Alarm Manager :

Codice (Java): [Seleziona]
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, ORA_UTENTE);
cal.set(Calendar.MINUTE, MINUTI_UTENTE);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal2 = cal.getTimeInMillis();

Intent intent_start = new Intent(this, new_activity.class);
intent_start.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

pintent = PendingIntent.getActivity(this, 0, intent_start, 0);
alarm = (AlarmManager) getSystemService(this.ALARM_SERVICE);
alarm.set(AlarmManager.RTC_WAKEUP, cal2, pintent);

A questo punto l'activity viene lanciata ma ho 2 problemi :

1) Il telefono se è in modalità sleep resta e non si accende quindi AlarmManager.RTC_WAKEUP non funziona e non capisco perchè...
2) se nel frattempo lancio un altro pendingintent questo sostituisce quello vecchio io invece vorrei che lo mettesse in coda e che ai rispettivi orari venisse lanciata nuovamente l'activity.

Grazie a chi mi vorrà dare un mano

Offline teskio

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 387
  • Respect: +118
    • Github
    • Google+
    • Mostra profilo
    • Skullab
  • Dispositivo Android:
    Cubot GT99 / SurfTab Ventos 10.1
  • Play Store ID:
    Skullab Software
  • Sistema operativo:
    windows 7 / ubuntu 12.04
Re:AlarmManager
« Risposta #1 il: 14 Gennaio 2011, 02:15:54 CET »
+1
Per il primo quesito credo che questo ti possa aiutare Android reference | PowerManager
In pratica, per come farei io idealmente :
* Implementerei un BroadcastReceiver il quale riceve l'intent
* Otterei il wakelock
* Lancerei il Service

Per il secondo quesito proverei a settare il flag FLAG_UPDATE_CURRENT sul pending intent. (anche se non ho ben capito che cosa volevi fare... ???)

E' solo un'idea, ma bisognerebbe rivedere la struttura dell'applicazione  :-P
« Ultima modifica: 14 Gennaio 2011, 02:19:50 CET da teskio »

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AlarmManager
« Risposta #2 il: 14 Gennaio 2011, 08:56:32 CET »
0
Ciao e grazie per la risposta.
In pratica questa mia applicazione ha una schermata nella quale l'utente specifica vari dati tra cui l'orario in cui dovrá essere avvertito. Al raggiungimento dell'orario deve partire una activity grande quanto tutto lo schermo che contenga i dati inseriti ed ovviamente gli accenda il telefono. E' ovvio che se l'utente ha inserito piú di un evento da ricordare in orari diversi questi devono comparire a video entrambi e nei rispettivi orari. Alla funzione a PowerManager c'ero arrivato ieri sera anche se non capisco proprio perchè quella dell'AlarmManager non funziona....comunque con PowerManager ora il telefono mi si accende peró se è impostato il lock screen non visualizza sopra di esso l'activity lanciata e poi c'è il problema del PendIntent che non puó essere lanciato per piú di una volta....pur utilizzando il flag update come dici, il nuovo pending va a sostituire il precedente con i nuovi dati e quindi la notifica sará sempre una!!

Attualmente il mio programma dopo l'immissione dei dati da parte dell'utente lancia un Service nel quale poi lancio l'AlarmManager con il PendingIntent all'orario stabilito ma con questo metodo se immetto 2 orari viene notificato sempre e solo l'ultimo inserito....

Idee ????

Grazie tante!!!

Offline Daystrom

  • Utente junior
  • **
  • Post: 90
  • Respect: +13
    • Mostra profilo
    • Starfleet
  • Dispositivo Android:
    HTC Magic + HTC Desire HD + Nexus S
  • Play Store ID:
    Daystrom
  • Sistema operativo:
    WXP
Re:AlarmManager
« Risposta #3 il: 14 Gennaio 2011, 10:03:26 CET »
0
2) se nel frattempo lancio un altro pendingintent questo sostituisce quello vecchio io invece vorrei che lo mettesse in coda e che ai rispettivi orari venisse lanciata nuovamente l'activity.

Grazie a chi mi vorrà dare un mano

Un mio collega ha fatto un'applicazione per la gestione dei todo e mi ha spiegato che puoi creare un solo allarme per intent (o activity, non ricordo). Inoltre l'allarme viene cancellato se l'utente spegne il cellulare. Perciò la sua applicazione esegue queste funzioni:

  • allo start del cellulare verifica quale allarme deve essere settato e lo imposta. Se nel frattempo (mentre il cell era spento) alcuni eventi sono trascorsi senza aver potuto avvisare l'utente, invia una notifica per ognuno di essi.
  • quando il sistema attiva l'activity a causa dell'allarme, viene settato il prossimo allarme.
  • se l'utente attiva l'activity e modifica qualcosa vengono riverificati i dati e viene impostato l'eventuale nuovo allarme.

Scusa se non sono stato molto tecnico, spero di averti aiutato e che si capisca quali sono i problemi che ha dovuto affrontare.

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AlarmManager
« Risposta #4 il: 14 Gennaio 2011, 10:55:01 CET »
0
Un mio collega ha fatto un'applicazione per la gestione dei todo e mi ha spiegato che puoi creare un solo allarme per intent (o activity, non ricordo). Inoltre l'allarme viene cancellato se l'utente spegne il cellulare. Perciò la sua applicazione esegue queste funzioni:

  • allo start del cellulare verifica quale allarme deve essere settato e lo imposta. Se nel frattempo (mentre il cell era spento) alcuni eventi sono trascorsi senza aver potuto avvisare l'utente, invia una notifica per ognuno di essi.
  • quando il sistema attiva l'activity a causa dell'allarme, viene settato il prossimo allarme.
  • se l'utente attiva l'activity e modifica qualcosa vengono riverificati i dati e viene impostato l'eventuale nuovo allarme.

Scusa se non sono stato molto tecnico, spero di averti aiutato e che si capisca quali sono i problemi che ha dovuto affrontare.

Grazie anche a te per la risposta :)

Avevo pensato al fatto che l'activity lanciata potesse settare l'allarme successivo ma mi sembrava una soluzione un pochino "sporca" per quello ho aperto questo topic per vedere se ci fosse una soluzione magari facendo partire l'alarm da un brdcast receiver o altro...altrimenti dovrei implementare a logica del tuo amico....

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:AlarmManager
« Risposta #5 il: 10 Febbraio 2011, 15:59:21 CET »
0
.....
1) Il telefono se è in modalità sleep resta e non si accende quindi AlarmManager.RTC_WAKEUP non funziona e non capisco perchè...
...

Ciao mimmog
mi ritrovo con un problema analogo, alla fine come hai risolto?

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AlarmManager
« Risposta #6 il: 10 Febbraio 2011, 16:12:24 CET »
0
Devi utilizzare il PowerManager come detto da teskio ;)

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:AlarmManager
« Risposta #7 il: 10 Febbraio 2011, 17:06:20 CET »
0
Devi utilizzare il PowerManager come detto da teskio ;)

Cedo che mi sia sfuggito qualcosa :-\

Io ho la mia Activity principale, dove setto un bel pò di opzioni tra cui un timer. Una volta cliccato su un bottone imposto un allarm manager con i dati inseriti e faccio terminare la mia classe.

Codice (Java): [Seleziona]
public void onClick(View v) {

                Calendar calendar = Calendar.getInstance();
                calendar.add(Calendar.MINUTE, timerSharedPreference.getInt("minute", 0));
                calendar.add(Calendar.SECOND, timerSharedPreference.getInt("second", 0));

                Intent intent = new Intent(getApplicationContext(), CallReceiver.class);

                PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent,
                                PendingIntent.FLAG_UPDATE_CURRENT);

                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                                sender);

                Log.i("Main", "Richiesta inviata");

                finish();

        }

Al momento opportuno parte il mio broadcastReceiver che lancia una nuova activity
Codice (Java): [Seleziona]
public class CallReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

                Log.i("CallReciver", "Richiesta ricevuta");

                Intent newIntent = new Intent(context, MiaClasse.class);
                newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                context.startActivity(newIntent);

        }

}

Quindi come faccio a controllare quello che succede tra il lancio del pendig intet a la ricezione da parte del brodcast?

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AlarmManager
« Risposta #8 il: 10 Febbraio 2011, 17:33:59 CET »
0
sono in macchina stasera guardo il codice e ti dico,che per caso sull'emulatore hai anche il look screen? se si devi sbloccare anche quello. Comunque nell'activity che richiama il PendingIntent devi fare un wakeup del telefono con il PowreManager se hai pazienza in tarda serata ti posto il codice

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:AlarmManager
« Risposta #9 il: 10 Febbraio 2011, 18:02:30 CET »
0
.... se hai pazienza in tarda serata ti posto il codice

Grazie mille :-)

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AlarmManager
« Risposta #10 il: 10 Febbraio 2011, 19:10:06 CET »
+1
Ecco metti questo nell'activity CallReceiver.class

PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
wake=powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
wake.acquire();

quando finiesce l'activity ricordati di richiamare il wake.release() altrimenti resta sempre acceso....

Offline Gambanera

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Vodafone ideos
  • Play Store ID:
    Gambanera
  • Sistema operativo:
    Ubuntu 10.10 / Windows 7
Re:AlarmManager
« Risposta #11 il: 11 Febbraio 2011, 13:57:20 CET »
0
Ecco metti questo nell'activity CallReceiver.class

PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
wake=powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
wake.acquire();

quando finiesce l'activity ricordati di richiamare il wake.release() altrimenti resta sempre acceso....

Grazie ancora. Una volta arrivato a casa lo implemento

Offline micandroid

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
Re:AlarmManager
« Risposta #12 il: 12 Febbraio 2011, 17:28:18 CET »
0
Ciao,
anche io vorrei realizzare un manager di allarmi inseriti dall'utente.
Potreste indicarmi la documentazione sugli oggetti utili per la realizzazione?

Grazie.

Offline thejungle

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:AlarmManager
« Risposta #13 il: 29 Marzo 2011, 11:23:36 CEST »
0
ciao anche io ho il problema che quando inserisco 2 allarmi prende solo e soltando l'ultimo.

Avete qualche idea su come posso risolvere?

Vi ringrazio in anticipo?

Offline mimmog

  • Utente senior
  • ****
  • Post: 731
  • Respect: +11
    • MisterX_Dev
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note e Galaxy Nexus
  • Play Store ID:
    MisterX_Dev
  • Sistema operativo:
    Windows 7
Re:AlarmManager
« Risposta #14 il: 29 Marzo 2011, 12:10:34 CEST »
0
E' normale, se vuoi lanciarne 2 allora devi creare un secondo pending intent con flag diverso da quello impostato con il primo pending intent altrimenti te lo sostituisce al primo