Autore Topic: Mal funzionamento AlarmManager  (Letto 915 volte)

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Mal funzionamento AlarmManager
« il: 09 Maggio 2012, 10:47:26 CEST »
0
Salve a tutti, devo ancora approfondire se la causa del malfunzionamento del programma sia dovuto proprio all'alarmmanager oppure c'è altro che non considero.
Ho bisogno che la mia applicazione mandi il telefono in standby(cioè telefono con schermo nero) alla fine di un set di operazioni e che lo riattivi dopo tot minuti(precisi il più possibile) accendendo il telefono e rifacendo il set di operazioni precedenti e che vada avanti con questo coppia di standby-set operazioni per un bel po di tempo.

per realizzarlo ho utilizzato un wakelock per mandarlo in standby e poi un alarmmanager per riscvegliarlo:

setto il wakelock
Codice (Java): [Seleziona]
mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,"MyTAG");
mWakeLock.setReferenceCounted(false);
mWakeLock.acquire();

attivo il wakelock
Codice (Java): [Seleziona]
mWakeLock.release();
poi tramite questo codice:
Codice (Java): [Seleziona]
Bundle backet = new Bundle();
                        backet.putInt("iteration", Iteration);
                        Intent intent = new Intent(this, AlarmTimer.class);
                        intent.putExtras(backet);
                          PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
                            intent, PendingIntent.FLAG_ONE_SHOT);
                        am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                        long durata=System.currentTimeMillis()-inizio;
                        am.set(AlarmManager.RTC_WAKEUP,  System.currentTimeMillis() + (serverComunication.returnData(keyServerData.TMP_STDBY) * 60000) - durata , pendingIntent);
(serverComunication.returnData(keyServerData.TMP_STDBY)=10minuti)

dovrei chiamare, per quello che ho capita una mia classe(alarmTimer) che riattivi il telefono:
Codice (Java): [Seleziona]
nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
(...)
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,new Intent(), 0);
Notification notif = new Notification(R.drawable.icon,mess,System.currentTimeMillis()+1000);
notif.setLatestEventInfo(context, from, message, contentIntent);
nm.notify(1, notif);
Intent newIntent = new Intent(context, ScadaAndroidActivity.class);

con il codice che vi ho riportato ho il problema che non si sveglia a intervalli constanti ma un po come gli va.Ho notato che però va sempre più di quello che chiedo(cioè quanto setto serverComunication.returnData(keyServerData.TMP_STDBY))

Per piacere se riuscite a darmi una mano sarebbe il massimo.

Il codice deve girare su terminali galaxy nexus con ics nel frattempo che aspetto una vostra notizia io controllo il sostituto della notification che in ICS è deprecata.

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Mal funzionamento AlarmManager
« Risposta #1 il: 11 Maggio 2012, 09:34:06 CEST »
0
ora ho messo a posto il metodo che prima era deprecato, è devo dire che ho trovato un buon miglioramento..però non è mai precisa al 100% l'evento viene a verificarsi sempre un pochino in ritardo( tra i 3e i5 minuti di ritardo)

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:Mal funzionamento AlarmManager
« Risposta #2 il: 11 Maggio 2012, 09:46:13 CEST »
0
ora ho messo a posto il metodo che prima era deprecato, è devo dire che ho trovato un buon miglioramento..però non è mai precisa al 100% l'evento viene a verificarsi sempre un pochino in ritardo( tra i 3e i5 minuti di ritardo)

E' davvero strano. Io uso l'AlarmManager per impostare scadenze anche a settimane di distanza, e sono sempre precise al secondo.

Mi viene solo in mente di fare "logging" dei parametri di costruzione dell'AlarmManager per verificare sia effettivamente giusti.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Mal funzionamento AlarmManager
« Risposta #3 il: 11 Maggio 2012, 10:01:02 CEST »
0
Mi viene solo in mente di fare "logging" dei parametri di costruzione dell'AlarmManager per verificare sia effettivamente giusti.
come posso fare?intendi i millisecondi che devo far aspettare?.

Il metodo deprecato l'ho modificato come segue:

Codice (Java): [Seleziona]
Intent notificationIntent = new Intent(context, ScadaAndroidActivity.class);
                        notificationIntent.putExtras(bundleinvio);
                        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

                        PendingIntent contentIntent = PendingIntent.getActivity(context,
                                0, notificationIntent,
                                PendingIntent.FLAG_CANCEL_CURRENT);

                        NotificationManager nm = (NotificationManager) context
                                .getSystemService(Context.NOTIFICATION_SERVICE);

                        Resources res = context.getResources();
                        Notification.Builder builder = new Notification.Builder(context);
                       
                        String mess;
                        if (bundle.getInt("iteration") <= serverComunication.returnData(keyServerData.ITE_MAX))
                                mess="Lancio del test numero " + bundle.getInt("iteration");
                        else
                                mess="test concluso dopo " + (bundle.getInt("iteration")-1)+ " iterazioni";
                       
                        builder.setContentIntent(contentIntent)
                                    .setSmallIcon(R.drawable.icon)
                                    .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.icon))
                                    .setTicker("test:"+bundle.getInt("iteration"))
                                    .setWhen(System.currentTimeMillis()+1000)
                                    .setAutoCancel(true)
                                    .setContentTitle("test:"+bundle.getInt("iteration"))
                                    .setContentText(mess);
                        Notification n = builder.getNotification();

                        nm.notify(0, n);
                        context.startActivity(notificationIntent);

Offline mambu

  • Utente normale
  • ***
  • Post: 167
  • Respect: +1
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Mal funzionamento AlarmManager
« Risposta #4 il: 11 Maggio 2012, 10:48:28 CEST »
0
credo di aver intuito che il problema non è l'alarm ma come vado a riaccendere lo schermo..ho appena provato a premere manualmente col tasto laterale il telefono che si sarebbe dovuto essere già svegliato e non l'aveva fatto e appena ho premuto il mio programmino è ripartito immediatamente.

il codice sotto riportato per il wakelock lo eseguo appena viene lanciata dal receiver dell'alarm tramite
Codice (Java): [Seleziona]
context.startActivity(notificationIntent);
all'onstart dell' activity lanciata.