JavascriptProva

venerdì 1 luglio 2016

Studio del binding dei Services

Questo è il codice del binding nel Service:
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
Che ci faccio?

Nel tutorial c'è questo codice:
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
Parto da un nucleo che mi sembra fondamentale:
 public class LocalBinder extends Binder{
  Servizio getService(){
   return Servizio.this;
  }
 }
Una classe derivata del tipo Binder, che ha un metodo chiamato getService(), il quale restituisce questo stesso Service.

Immagino che di questa classe bisogni creare un'istanza.
Che sarebbe questa:
private IBinder mBinder=new LocalBinder();
e che viene restituita dal metodo onBind:
 @Override
 public IBinder onBind(Intent intent) {
  return mBinder;
 }

Facciamo una sintesi:

Viene dichiarata una classe LocalBinder di tipo Binder, che restituisce il contesto di questo Service.
Di questa classe viene creata un'istanza di tipo IBinder.
Questa istanza viene restituita dal metodo IBinder onBind, che è quello da includere necessariamente nel Service.

Abbiamo visto IBinder e Binder. Che cosa sono? In che rapporto sono fra di loro?
Binder sarebbe una classe derivata di IBinder...
Ora vediamo come si comporta l'attività che si collega al service.
Ha una variabile di tipo Servizio:
Servizio mService;
Ora, la connessione si realizza tramite un classico Intent:
        Intent intent = new Intent(this, Servizio.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
e qui è stata posta nell'evento onStart dell'Attività.
La connessione è però verificata mediante l'evento OnServiceConnected.
        @Override
        public void onServiceConnected(ComponentName className,
                IBinder service) {
            // We've bound to LocalService, cast the IBinder and get LocalService instance
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            mBound = true;
        }
Che accidenti accade qui? Vengono portati come parametri className e service.
Localbinder dove lo abbiamo preso?
Ecco: è una classe pubblica dichiarata nel service, quella che estendeva Binder.
Ecco: come parametro viene fornito service che è di tipo IBinder, e questo sarebbe l'istanza della classe LocalBinder.
binder.getService() sarebbe quindi il service.
Quindi viene dichiarato true mBound, che significa che l'attività e il service sono collegati.

Un bel guazzabuglio!

Provo, molto timidamente, a scrivere il codice...


La prima variabile dichiarata era una variabile di tipo Servizio.
Servizio mService;
In questa variabile andrà posto il service.

Quindi in onStart si realizza il collegamento, con un semplice Intent:
 @Override
 public void onStart(){
  Intent intent=new Intent(this,Servizio.class);
  bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
  super.onStart();
 }
Ecco: mConnection è una classe che implementa l'interfaccia ServiceConnection:
 private ServiceConnection mConnection=new ServiceConnection(){

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   
   
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
   // TODO Auto-generated method stub
   
  }
  
 };
Questo si scrive in modo quasi automatico.
Quindi riempiamo il corpo di onServiceConnected:
Prima si definisce l'istanza di LocalBinder estendente Binder, presentata come parametro; quindi si estrae da questa il Service.
 ServiceConnection mConnection=new ServiceConnection(){

  @Override
  public void onServiceConnected(ComponentName name, IBinder service) {
   LocalBinder mBinder=(LocalBinder)service;
   mService=mBinder.getService();
   
   mService.Scrivi();
  }

  @Override
  public void onServiceDisconnected(ComponentName name) {
   // TODO Auto-generated method stub
   
  }
  
  
 };

Nessun commento:

Posta un commento