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