JavascriptProva

domenica 19 giugno 2016

Studio dei due Service che si rincorrono

Mi devo esercitare meglio per perfezionare il meccanismo.

Con Services semplici.

Riscriviamo Alfa e Beta.


Alfa:
public class Alfa extends Service{

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

Beta:
public class Beta extends Service{

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 
}
Aggiungo ad ambedue onStartCommand e onDestroy:

ALfa:
public class Alfa extends Service{
 
 @Override
 public int onStartCommand(Intent intent, int flags, int startUI){
  return Service.START_NOT_STICKY;
 }
 
 @Override
 public void onDestroy(){
  super.onDestroy();
 }

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

Beta:
public class Beta extends Service{

 @Override
 public int onStartCommand(Intent intent, int flags, int startUI){
  return Service.START_NOT_STICKY; 
 }
 
 @Override
 public void onDestroy(){
  super.onDestroy();
 }
 
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 
}


Ora faccio eseguire a Beta un compito, come scrivere qualcosa in LogCat:
 @Override
 public int onStartCommand(Intent intent, int flags, int startUI){
  Log.v("BETA","COMPITO ESEGUITO");
  stopSelf();
  return Service.START_NOT_STICKY; 
 }
Alfa può evocare Beta e poi distruggersi.
Anziché farlo in onStartCommand, per concentrare tutto, può farlo in onDestroy, se in onStartCommand inserisco stopSelf.
public class Alfa extends Service{
 
 @Override
 public int onStartCommand(Intent intent, int flags, int startUI){
  stopSelf()
  return Service.START_NOT_STICKY;
 }
 
 @Override
 public void onDestroy(){
  startService(new Intent(this,Beta.class));
  super.onDestroy();
 }

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 
}
Mettiamo gli indici ai metodi e proviamo...
public class Alfa extends Service{
 
 @Override
 public int onStartCommand(Intent intent, int flags, int startUI){
  Log.v("ALFA","ONSTARTCOMMAND");
  stopSelf();
  return Service.START_NOT_STICKY;
 }
 
 @Override
 public void onDestroy(){
  Log.v("ALFA","ONDESTROY");
  startService(new Intent(this,Beta.class));
  super.onDestroy();
 }

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 
}
Proviamo... Bene.
Mettiamo tutti i markers e riproviamo.
public class Alfa extends Service{
 
 @Override
 public int onStartCommand(Intent intent, int flags, int startUI){
  Log.v("ALFA","ONSTARTCOMMAND");
  stopSelf();
  Log.v("ALFA","/ ONSTARTCOMMAND");
  return Service.START_NOT_STICKY;
 }
 
 @Override
 public void onDestroy(){
  Log.v("ALFA","ONDESTROY");
  startService(new Intent(this,Beta.class));
  Log.v("ALFA","/ ONDESTROY");
  super.onDestroy();
 }

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

 @Override
 public int onStartCommand(Intent intent, int flags, int startUI){
  Log.v("BETA","ONSTARTCOMMAND");
  Log.e("BETA","Esecuzione del compito stabilito");
  stopSelf();
  Log.v("BETA","/ ONSTARTCOMMAND");
  return Service.START_NOT_STICKY; 
 }
 
 @Override
 public void onDestroy(){
  Log.v("BETA","ONDESTROY");
  Log.v("BETA","/ ONDESTROY");
  super.onDestroy();
 }
 
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 
}
Ed ecco la sequenza:
06-19 18:51:02.222: V/ALFA(29067): ONSTARTCOMMAND
06-19 18:51:02.222: V/ALFA(29067): / ONSTARTCOMMAND
06-19 18:51:02.242: V/ALFA(29067): ONDESTROY
06-19 18:51:02.252: V/ALFA(29067): / ONDESTROY
06-19 18:51:02.252: V/BETA(29067): ONSTARTCOMMAND
06-19 18:51:02.252: E/BETA(29067): Esecuzione del compito stabilito
06-19 18:51:02.262: V/BETA(29067): / ONSTARTCOMMAND
06-19 18:51:02.262: V/BETA(29067): ONDESTROY
06-19 18:51:02.262: V/BETA(29067): / ONDESTROY
Ora, se in onDestroy di Beta metto un richiamo ad Alfa creo un circolo vizioso:
 public void onDestroy(){
  Log.v("BETA","ONDESTROY");
  startService(new Intent(this,Alfa.class));
  Log.v("BETA","/ ONDESTROY");
  super.onDestroy();
 }
Dovrò riavviare il cellulare...


Qual è il modo migliore per interrompere il circolo vizioso infinito?

Nessun commento:

Posta un commento