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