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