JavascriptProva

sabato 18 giugno 2016

Due Services che si mordono la coda (con il dovuto ritardo)

Sto facendo tentativi per ottenere ogni volta un intervallo casuale fra le ripetizioni di un Service.

Sto pensando, in proposito, a un sistema di due Services che si chiamino l'uno con l'altro.
Uno chiama l'altro che esegue il compito e si distrugge, quindi questo esegue il compito, si distrugge e in quel momento richiama il primo.
Proviamo con due Services nuovi...

Sì, ci sono riuscito.
Ecco i codici:

MainActivity:
public class MainActivity extends Activity {

 Button button;
 Button bttStart;
 Intent intent;
 AlarmManager alarmManager;
 PendingIntent pendingIntent;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  

  
  button=(Button)findViewById(R.id.button1);
  bttStart=(Button)findViewById(R.id.button2);
  
  button.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    Globals.stop=true;
   }
  });
  
  bttStart.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    Globals.stop=false;
    intent=new Intent(getApplicationContext(),Alfa.class); 
    startService(intent);
    
   }
  });

  
 }
}


Alfa:
public class Alfa extends Service{

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 
 @Override
 public int onStartCommand(Intent intent,int flags,int startUI){
  Log.v("ALFA","ONSTARTCOMMAND");
  if (Globals.stop==false){
   Intent i=new Intent(this,Beta.class);
   PendingIntent pendingIntent=PendingIntent.getService(this,0,i,0);
   AlarmManager alarmManager=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
   alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+10*1000, pendingIntent);
   stopSelf();
  }
  return Service.START_NOT_STICKY;
  
 }
        @Override
 public void onDestroy(){
  Log.v("ALFA","ONDESTROY");
  super.onDestroy();
  
 }

}


Beta:
public class Beta extends Service{

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }

 @Override
 public int onStartCommand(Intent intent, int flags,int startUI){
  Log.v("BETA","ONSTARTCOMMAND");
  if(Globals.stop==false){
   Intent i=new Intent(this,Alfa.class);
   startService(i);
   stopSelf();
  }
  return Service.START_NOT_STICKY;
  
 }
 @Override
 public void onDestroy(){
  Log.v("BETA","ONDESTROY");
  super.onDestroy();
  
 }

}
In più è dichiarata una variabile globale:
public class Globals {
 public static boolean stop=false;
}



Quali sono i princìpi:
MainActivity alla pressione di un bottone chiama Alfa:
  bttStart.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    Globals.stop=false;
    intent=new Intent(getApplicationContext(),Alfa.class); 
    startService(intent);
    
   }
  })


Alfa all'avvio, ossia in onStartCommand, chiama Beta e stoppa se stesso con un ritardo stabilito da AlarmManager:
 @Override
 public int onStartCommand(Intent intent,int flags,int startUI){
  Log.v("ALFA","ONSTARTCOMMAND");
  if (Globals.stop==false){
   Intent i=new Intent(this,Beta.class);
   PendingIntent pendingIntent=PendingIntent.getService(this,0,i,0);
   AlarmManager alarmManager=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
   alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+10*1000, pendingIntent);
   stopSelf();
  }
  return Service.START_NOT_STICKY;
  
 }


Beta all'avvio, ossia in onStartCommand, chiama Alfa e stoppa se stesso:
@Override
 public int onStartCommand(Intent intent, int flags,int startUI){
  Log.v("BETA","ONSTARTCOMMAND");
  if(Globals.stop==false){
   Intent i=new Intent(this,Alfa.class);
   startService(i);
   stopSelf();
  }
  return Service.START_NOT_STICKY;
  
 }
Alfa, attivato, richiama Beta (sempre con il ritardo di AlarmManager) e stoppa se stesso, e così via in un loop senza fine.

Per stoppare il loop abbiamo una variabile globale booleana Globals.Variabile che inizialmente è false e appunto per andare avanti ad aprirsi a vicenda fra Alfa e Beta è impostata la condizione che questa variabile sia false: nel bottone 2 di MainActivity c'è il codice per impostare questa variabile a true:
  button.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    Globals.stop=true;
   }
  });
e questo, facendo venire meno la condizione per l'apertura reciproca dei due Services, interrompe efficacamente il processo.

L'ho idato io: ingegnoso!

Nessun commento:

Posta un commento