Ho sul cellulare ambedue, e ha un comportamento di questo genere: Avvio la App1 che crea il Service, e mi appare il toast di inizio, quello che viene mostrato nel metodo onStartCommand.
Quindi bindo la stessa App1, che nel corso del binding rileva i metodi del Service e fa partire il metodo esegui() del Servizio, che mostra il toast "Questo è il service".
Chiudo App1 e lancio App2, che binda ugualmente il Service dandomi un segnale proveniente dalla stessa App2, perché non so eseguire metodi del Service quando questo viene bindato da esterno.
Il Service continua a stare attivo nel cellulare, perché anche a distanza di ore, quando eseguo App2, esso viene bindato.
Però sia che venga bindato con App1, sia che lo venga con App2, il binding funziona una volta sola. O meglio, essendo l'App già bindata non si binda un'altra volta, e dal momento che i segnali che ho posto nel binding sono ambedue dipendenti dal momento in cui il binding si crea, non appaiono più una volta che il binding già esista.
Mi esercito nel fare il binding e cerco di imparare a fare l'unbinding per i Services chiamati dalla stessa App, quindi proverò a imparare la sintassi del Message per il binding di Services chiamati da un'altra App.
Ho trovato il codice.
Esercitiamoci di nuovo con il binding e ci aggiungiamo unbinding.
Ma prima è il caso di salvarsi il codice per il tentativo che mi è già riuscito...
MainActivity:
public class MainActivity extends Activity { ServiceConnection serviceConnection; Service serviceReference; Button button; boolean isBound; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent=new Intent(getApplicationContext(),Servizio.class); startService(intent); button=(Button)findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(getApplicationContext(),Servizio.class); bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE); } }); serviceConnection=new ServiceConnection(){ Servizio servizio; @Override public void onServiceConnected(ComponentName name, IBinder service) { Servizio.MyBinder binder=(Servizio.MyBinder)service; servizio=binder.getService(); servizio.esegui(); } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }; } }
Servizio:
public class Servizio extends Service{ IBinder mioServizio=new MyBinder(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return mioServizio; } @Override public int onStartCommand(Intent intent, int flags, int startUI){ Toast.makeText(this, "Servizio attivato", Toast.LENGTH_LONG).show(); return Service.START_STICKY; } public class MyBinder extends Binder{ Servizio getService(){ return Servizio.this; } } public void esegui(){ Toast.makeText(this, "Questo è il Service", Toast.LENGTH_LONG).show(); } }
Adesso, come al solito, rompiamo il Mandala...
E ricostruiamo, prima la semplice creazione di un Service e poi il codice col binding.
Servizio:
public class Servizio extends Service{ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public int onStartCommand(Intent intent, int flage, int startUI){ Toast.makeText(this, "onStartCommand", Toast.LENGTH_LONG).show(); return Service.START_STICKY; } }
MainActivity:
public class MainActivity extends Activity { Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=(Button)findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(getApplicationContext(),Servizio.class); startService(intent); } }); } }
Facile...
Adesso invece avrò bisogno certamente di sbirciare...
Servizio:
public class Servizio extends Service{ IBinder myBinder=new MyBinder(); @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return myBinder; } public class MyBinder extends Binder{ Servizio getReference(){ return Servizio.this; } } @Override public int onStartCommand(Intent intent, int flage, int startUI){ Toast.makeText(this, "onStartCommand", Toast.LENGTH_LONG).show(); return Service.START_STICKY; } public void esegui(){ Toast.makeText(this, "metodo ESEGUI del Service", Toast.LENGTH_LONG).show(); } }
MainActivity:
public class MainActivity extends Activity { ServiceConnection serviceConnection; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent=new Intent(getApplicationContext(),Servizio.class); startService(intent); button=(Button)findViewById(R.id.button1); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(getApplicationContext(),Servizio.class); bindService(intent,serviceConnection,Context.BIND_AUTO_CREATE); } }); serviceConnection=new ServiceConnection(){ Servizio servizio; @Override public void onServiceConnected(ComponentName name, IBinder service) { Servizio.MyBinder binder=(Servizio.MyBinder)service; servizio=binder.getReference(); servizio.esegui(); Intent intent=new Intent(getApplicationContext(),Servizio.class); stopService(intent); unbindService(serviceConnection); } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }; } }E adesso il binding si fa ogni volta, e ogni volta appare il toast che testimonia l'avvenuto binding, ossia l'esecuzione del metodo del Service.
Nessun commento:
Posta un commento