Autore Topic: su risveglio del dispositivo, wake lock e alarmmanager  (Letto 1204 volte)

Offline Improving

  • Utente junior
  • **
  • Post: 56
  • Respect: 0
    • Google+
    • lorenz522
    • Mostra profilo
  • Dispositivo Android:
    Android HTC Desire Z
  • Play Store ID:
    Lorenzo Del Soldato
  • Sistema operativo:
    Ubuntu Linux 11.04
su risveglio del dispositivo, wake lock e alarmmanager
« il: 15 Luglio 2011, 16:44:18 CEST »
0
Volevo aprire una discussione su una cosa su cui mi sto scontrando e mi pare un po' confusa (perlomeno per me)

Risvegliare il dispositivo dallo stato di idle

Volevo quindi, anche naturalmente col vostro aiuto, fare un po' di chiarezza sull'argomento.

Il tutto è nato da un problema che ho, lancio dell'intent  per inviare sms che mi rimane bloccato quando il tel è in indle. Quindi mi dico, ok, prima accendo il dispositivo poi lancio l'intent (in quel modo non ho blocchi). Più facile a dirsi che a farsi.

Diciamo che un sistema rozzo ma efficace sarebbe quello di tirare su il power manager e fare un acquire con un DIM_BRIGHT_WAKELOCK o addirittura un FULL_WAKELOCK che ci assicurano lo schermo acceso, ma a parte il fatto che la cosa mi fa schifo, ma mi chiedo che succede quando a forza premo il pulsante power per forzare lo spegnimento del monitor.. Ma poi finiremmo la batteria alla velocità della luce in caso di durata prolungata dell'applicazione.

Avevo pensato anche (non mi piace ma volevo vedere se funzionava) di usare 2 wakelock separati, il primo che mi tenesse la cpu in runnig e il secondo per fare un acquire FULL_WAKELOCK per forzare l'accensione del dispositivo quando si verificavano determinate condizioni.
Non funziona.

un altro sistema dovrebbe essere quello di lanciare di istanziare un AlarmManager per poi chiamare la funzione set

Codice: [Seleziona]
set(int type, long triggerAtTime, PendingIntent operation)
Schedule an alarm.


magari, a triggerAtTime mettiamo un valore "basso", 1.. 2 secondi e come type possiamo mettere i sequenti valori

Codice: [Seleziona]
Constants
int        ELAPSED_REALTIME        Alarm time in SystemClock.elapsedRealtime() (time since boot, including sleep).
int        ELAPSED_REALTIME_WAKEUP        Alarm time in SystemClock.elapsedRealtime() (time since boot, including sleep), which will wake up the device when it goes off.
long        INTERVAL_DAY       
long        INTERVAL_FIFTEEN_MINUTES        Available inexact recurrence intervals recognized by setInexactRepeating(int, long, long, PendingIntent)
long        INTERVAL_HALF_DAY       
long        INTERVAL_HALF_HOUR       
long        INTERVAL_HOUR       
int        RTC        Alarm time in System.currentTimeMillis() (wall clock time in UTC).
[b]int        RTC_WAKEUP        Alarm time in System.currentTimeMillis() (wall clock time in UTC), which will wake up the device when it goes off.
[/b]

quelli con il "wake_up" dovrebbero essere quelli che ci interessano, RTC_WAKEUP nello specifico peccato che però ho fatto un po' di test, ma a menon funziona un tubo.

ecco lo snippet dell'esempio
Codice (Java): [Seleziona]
     but1.setOnClickListener(new OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                setWakeup(90000);
                        }
                });
       
       
 
    public boolean setWakeup(long time) {
               
          try {
            AlarmManager am = (AlarmManager)
              getApplicationContext().getSystemService(Context.ALARM_SERVICE);
       
            Intent smsIntent = new Intent(Intent.ACTION_VIEW);
                        smsIntent.setType("vnd.android-dir/mms-sms");
                        smsIntent.putExtra("address" , "1234567");
                        smsIntent.putExtra("sms_body", "test message");
                       
                       
            PendingIntent pending = PendingIntent.getActivity(getApplicationContext(), 0,
                        smsIntent, PendingIntent.FLAG_ONE_SHOT);
            am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + time, pending);
            return true;
          } catch (Exception e) {
            return false;
          }
        }


Ho messo un tempo di 90secondi, per dar tempo al mio desire z di addormentarsi. dopo quel tempo, non succede niuente. se lo sblocco trovo il programma dell'invio delle email bloccato, il mio solito problema.

Io sinceramente non capisco dove sto sbagliando. Dalla documentazione pare faccia una cosa, ma quando lo provo in reale sul dispositivo ne fa un'altra.

Eppure, il risveglio del dispositivo è ovviamente possibile, penso solo al programma della sveglia. Ma dov'è e qual'è il modo migliore?

Che ne pensate?

ah mi sono dimenticato di dire che mentre provavo tutti i miei esempi il logcat era sempre li attivo, ma non ho preso nessun tipo di errore o segnalazione.
« Ultima modifica: 15 Luglio 2011, 16:49:30 CEST da Improving »

Offline angeloschiavone

Re:su risveglio del dispositivo, wake lock e alarmmanager
« Risposta #1 il: 04 Agosto 2011, 13:00:01 CEST »
0
Ciao, mi sono scontrato anch'io con un problema simile; la soluzione sta nell'utilizzo combinato di AlarmManger e BroadcastReceiver.
L'applicazione ApiDemo che trovi inclusa nell'sdk android riporta un esempio ,in particolare guarda le classi  AlarmController e RepeatingAlarm.
questo è l'ascoltatore al button che fa partire l'alarm manager.
Codice (Java): [Seleziona]
    private OnClickListener mStartRepeatingListener = new OnClickListener() {
        public void onClick(View v) {
            // When the alarm goes off, we want to broadcast an Intent to our
            // BroadcastReceiver.  Here we make an Intent with an explicit class
            // name to have our own receiver (which has been published in
            // AndroidManifest.xml) instantiated and called, and then create an
            // IntentSender to have the intent executed as a broadcast.
            // Note that unlike above, this IntentSender is configured to
            // allow itself to be sent multiple times.
            Intent intent = new Intent(AlarmController.this, RepeatingAlarm.class);
            PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this, 0, intent, 0);
           
            // We want the alarm to go off 30 seconds from now.
            long firstTime = SystemClock.elapsedRealtime();
            firstTime += 15*1000;
           
            // Schedule the alarm!
            AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
            am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 15*1000, sender);

            // Tell the user about what we did.
            if (mToast != null) {
                mToast.cancel();
            }
            mToast = Toast.makeText(AlarmController.this, R.string.repeating_scheduled, Toast.LENGTH_LONG);
            mToast.show();
        }
    };

questo invece il tuo BroadcastReceiver che devi dichiarare nel manifest cosi:          <receiver android:name=".app.RepeatingAlarm" android:process=":remote" />
 
Codice (Java): [Seleziona]
public class RepeatingAlarm extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.e("pippo", "pippo");
       
        //Toast.makeText(context, R.string.repeating_received, Toast.LENGTH_SHORT).show();
    }
}


Ho lasciato girare lo snippet postato assieme a aLogcat (scaricabile free da market) e anche mentre il cel dorme vedo "pippo pippo" ad intervalli regolari.
Se, come nel tuo caso, il broadcast receiver non si deve limitare a stampare pippopippo ma deve fare un task + corposo, è opportuno che questo
lanci un servizio dove potrai acquisire e rilasciare un wakelock per la sola durata del task (invio sms nel tuo caso).

« Ultima modifica: 04 Agosto 2011, 15:52:29 CEST da angeloschiavone »