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