JavascriptProva

martedì 3 aprile 2018

Ripasso del binding di un service

Non ricordo come si binda un service.
E' necessario fare un po' di mandala in proposito.

Per prima cosa si costruisce una classe di tipo LocalBinder che estende Binder.
Questa classe restituisce il Service stesso.
    class LocalBinder extends Binder {
        Servizio getService(){
            return Servizio.this;
        }
    }
Da questa classe LocalBinder si può creare un oggetto come interfaccia IBinder, in quanto, dato che LocalBinder estende Binder e IBinder è implementatata da Binder, la procedura è del tutto lecita.
IBinder mBinder=new LocalBinder();
Questo va poi "sparato" nel metodo IBinder onBind(Intent intent)
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
Sulla principale, invece, la cosa non me la ricordo affatto...

Si comincia con il creare nella sezione "dichiarazioni", un oggetto di classe ServiceConnection.
public class MainActivity extends AppCompatActivity {


    ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Servizio.LocalBinder myIBinder=(Servizio.LocalBinder)iBinder;
            Servizio servizio=myIBinder.getService();
            servizio.verbo();
            mBound=true;

        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mBound=false;
        }
    };
    boolean mBound=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
Quindi (l'ho messo nel metodo onStart dell'activity non ricordo perché), si binda il service, che viene invece "sbindato" nel metodo onStop:
    @Override
    protected void onStart() {
        super.onStart();
        Intent intent=new Intent(this,Servizio.class);
        bindService(intent,connection,BIND_AUTO_CREATE);


    }

    @Override
    protected void onStop() {
        super.onStop();
        if(mBound){
            unbindService(connection);
            mBound=false;
        }
    }

Sarebbe il caso di analizzare il codice della creazione dell'oggetto di tipo ServiceConnection...

Distruggo selettivamente la creazione dell'oggetto per ricostruirla.

Questo è ciò che mi viene in automatico:
    ServiceConnection serviceConnection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };
Nel metodo onServiceConnected vengono forniti due parametri, ComponentName componentName e IBinder iBinder. Questi dovrebbero essere fondamentali...

IBinder iBinder dovrebbe essere quello che mi viene fornito dal metodo
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
del Service.
che è di classe LocalBinder. Quindi devo creare un oggetto nell'activity principale che sia dello stesso tipo LocalBinder, onde renderlo uguale all'oggetto liberatomi nei parametri, che è di tipo LocalBinder, e che quindi va castato. Provo ad eseguire a memoria:
    ServiceConnection serviceConnection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            Servizio.LocalBinder myIBinder=(Servizio.LocalBinder)iBinder;
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };
Ricordando che la classe LocalBinder, cui appartiene il mio oggetto "da questa parte" MyIBinder e l'oggetto "da quella parte" IBinder ha un metodo di tipo Servizio che restituisce il Service che sta da "quella parte", posso ottenere da questo metodo il Service.
Il metodo era di tipo Servizio e si chiamava getService(), e restituiva Servizio.this.
    class LocalBinder extends Binder {
        Servizio getService(){
            return Servizio.this;
        }
    }
Fatto questo posso ottenere il Service da questa parte.

Nessun commento:

Posta un commento