JavascriptProva

venerdì 17 giugno 2016

Chiamare un Service dopo un intervallo prestabilito di tempo, una sola volta

Adesso mi esercito con AlarmManager.
Ovviamente, prima di farlo con il TTS, meglio usare dei semplici Toast o dei Log in LogCat.


Creiamo un'app che mostri un Toast ogni 30 secondi.

Provo a creare un AlarmManager secondo quel poco che ricordo, certamente sbagliando...
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		AlarmManager alarmManager=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
		alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,)
...che è incompleto: il parametro successivo presente sul tutorial è SystemClock.elapsedRealtime() sommato a qualcosa...
Voglio vedere, criticamente, cosa è questo SystemClock.elapsedRealtime().

Dunque "commentizzo" il codice incompleto di cui sopra e me lo metto in LogCat.
		Log.v("SystemClock.elapsedRealtime",""+SystemClock.elapsedRealtime());
		
		/*AlarmManager alarmManager=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
		alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,)*/
E vediamo...

Ho ottenuto questo valore:
06-18 01:08:21.163: V/SystemClock.elapsedRealtime(19020): 8482000
Sospetto che si tratti di un valore in millisecondi: lo converto in ore...
8482 secondi,
141 minuti e 22 secondi
2 ore, 21 minuti e 22 secondi.

Dovrebbe essere il tempo passato dall'accensione del cellulare...

Ora per fare una prova lo spengo e lo riaccendo, e vediamo...

06-18 01:34:22.074: V/SystemClock.elapsedRealtime(9256): 661888
conversione: 11 min, 1 sec, 888 msec.
Ci sta!

Ora, mentre si esegue l'App viene stabilito un tempo passato dall'accensione del cellulare e viene stabilito che dopo un tot di millisecondi si deve verificare un dato evento.
Riprendiamo il codice...

Eccolo, completato con intent e pendingIntent:
public class MainActivity extends Activity {

	Button button;
	Intent intent;
	PendingIntent pendingIntent;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		intent=new Intent(this,Servizio2.class);
		pendingIntent=PendingIntent.getService(this, 0, intent, 0);
		AlarmManager alarmManager=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
		alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+1000*60,pendingIntent);
		
	}
}
Vediamo se funziona: dovrebbe scattare il Toast evocato dal Service dopo 60 secondi.

E non scatta!
Ovviamente, mi pareva strano che non ci fosse un errore...
non ho registrato il Service sul Manifest!.
Non funziona nemmeno con il semplice startService(intent).
Rimedio...
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <service android:name="Servizio"
            android:exported="true" />
        <service android:name="Servizio2" />
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" > 
Adesso vediamo...

Ora il Toast appare, ma appare subito, non dopo il tempo voluto.
Provo con il LogCat...

Appare subito e dopo un tempo congruente con i 60 secondi. Perché?

Perché sono cretino io!. Avevo lasciato startService(intent), e quindi appariva subito grazie a questo!

Ora rifaccio tutto (dopo soli 10 secondi perché sembra che il tempo non passi mai). Sì! Funziona!

Nessun commento:

Posta un commento