JavascriptProva

domenica 3 luglio 2016

AlarmManager in un Service bindato a due Activities.

Il problema è la variazione del Context, che potrebbe rendere non valida la procedura di stop dell'AlarmManager qualora il context della procedura di stop sia diverso da quello con cui è stata fatta la procedura di start.
L'esperimento che faccio adesso dovrebbe essere risolutivo.

Far passare molto tempo fra una comparsa e l'altra dell'attività Form.
In questo tempo, in cui è stata innescata una procedura start, manipolare il cellulare in vario modo.
Fare successivamente una procedura di stop, a una considerevole distanza dalla procedura di Start, verificando sempre il Context.

Vado... ci provo.
Tempo impostato a 2 minuti.
Avvio lo Start...

Faccio un po' di manovre e poi avvio lo Stop. Vediamo se appare la Form...

Ecco, lo stop ha funzionato, ma non avendo rilevato il codice del Context inizialmente non so se sia lo stesso codice nello Start e nello Stop.
Ripeto, annotando i codici dei Context.

07-03 17:22:59.307: E/CONTESTO START(2593): android.app.Application@423c10a8


07-03 17:23:55.632: E/CONTESTO STOP(3212): android.app.Application@423c8d88
Bene, i codici dei Context sono differenti, eppure lo stop ha funzionato lo stesso: siamo ben oltre i 2 minuti e l'attività Form non si è vista.


Ancora:
07-03 17:36:54.071: E/CONTESTO START(4041): android.app.Application@423c5c80
07-03 17:37:32.098: E/CONTESTO STOP(4183): android.app.Application@423c10a0
che ha funzionato.
Ora intervento per la cancellazione a quasi 2 minuti, col cronometro...
07-03 18:31:28.456: E/CONTESTO START(10875): android.app.Application@423c3ee0


07-03 18:32:51.447: E/CONTESTO STOP(11471): android.app.Application@423c1f88
Credo che il funzionamento sia abbastanza sicuro...



Ora dobbiamo far apparire lo status.
Creo una funzione CheckStatus nel Service...

Tutto fatto! Sto sperimentando, ora.
Ecco il codice del Service:
public class Timer extends Service {

 @Override
 public void onCreate(){
  Log.d("SERVICE","ONCREATE");
 }
 
 @Override
 public void onDestroy(){
  super.onDestroy();
  Log.d("SERVICE","ONDESTROY");
 }
 
 IBinder mBinder=new LocalBinder();
 
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return mBinder;
 }
 
 public class LocalBinder extends Binder{
  Timer getService(){
   return Timer.this;
  }
 }
 
 public void StartTime(){
  Log.e("CONTESTO START",getApplicationContext()+"");
  Intent intent=new Intent(getApplicationContext(),Form.class);
  PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0);
  AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
  alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+120*1000, pendingIntent);
 }
 
 public void StopTime(){
  Log.e("CONTESTO STOP",getApplicationContext()+"");
  Intent intent=new Intent(getApplicationContext(),Form.class);
  PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0);
  AlarmManager alarmManager=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
  alarmManager.cancel(pendingIntent);
  if(pendingIntent!=null)pendingIntent.cancel();
 }
 
 public boolean AlarmOn(){
  Intent intent=new Intent(getApplicationContext(),Form.class);
  boolean alarmUp=(PendingIntent.getActivity(getApplicationContext(),0,intent,PendingIntent.FLAG_NO_CREATE)!=null);
  return alarmUp;
 }


}
...e speriamo che funzioni!

Nessun commento:

Posta un commento