Bound Service

Service

BoundService

  • Se usa para ejecutar en segundo plano operaciones largas.
  • Seguirá en memoria aunque el que lo haya invocado ya no lo esté.

 

  • Se usa para ejecutar en segundo plano operaciones largas.
  • Arquitectura cliente - servidor:
  • El cliente ejecuta una función y espera un resultado.
  • Debe haber un canal de comunicación.
     

Bound Service

  • Se inicia desde una actividad mediante el método bindService()
  • Existe mientras tenga componentes ligados
  • Orientados para proporcionar información (a otras aplicaciones también, intent filter)
  • Hay que programar interfaz cliente-servicio:
    • Extender clase Binder (servicio privado de la actividad)
    • Utilizar un Messenger (comunicación entre procesos)
    • Utilizar AIDL (varios threads)
  • Se tienen que implementar métodos principales

Métodos principales

  • onCreate():
    • Creación del servicio (una vez)
  • onBind():
    • Retorna interfaz para la comunicación cliente-servicio
  • onDestroy():
    • Destrucción del servicio
  • onUnbind():
    • Si retornamos true se llamará a onRebind() la siguiente vez que un cliente se conecte
  • onRebind():
    • Si queremos realizar algo diferente con los siguientes bind

Creación

  • Declaración en el manifest
<service android:name=".BoundService">
    <intent-filter>
        <action android:name="BOUNDSERVICE"></action>
    </intent-filter>
</service>

Creación

public class BoundService extends Service {
    public int código = 0;

    private final IBinder binder = new MyBinder();

    public class MyBinder extends Binder {
        BoundService getService() {
            return BoundService.this;
        }

    @Override
    public IBinder onBind(Intent arg0) {
        return binder;
    }
    
    @Override
    public void onDestroy() {
        //TODO código para liberar recursos
    }
    
    public int multiplica() {
        return codigo*5;
    }
}

Utilización

  • Crear Intents + llamadas:
    • Intent intent = new Intent(”BOUNDSERVICE"); 
      • en caso de haber declarado intent filter
    • Intent intent = new Intent(MyActivity.this, BoundService.class);
  • bindService(intent, Connection, Context.BIND_AUTO_CREATE);
  • unbindService(connection);
  • Implementar connection

Utilización II

  • Extender clase actividad
public class BoundServiceActivity extends Activity {
    ...
    BoundService bService;
    boolean bound = false;
    Intent intent = new Intent(BoundServiceActivity.this, BoundService.class);
    bindService(intent, connection, Context.BIND_AUTO_CREATE);
    
    private ServiceConnection connection = new ServiceConnection(){
        @Override
        public void onServiceConnected(ComponentName className, iBinder binder){
            MyBinder binder = (MyBinder) binder;
            bService = binder.getService();
            bound = True;
        }
        
        @Override
        public void onServiceDisconnected(ComponentName arg0){
            bound = false;
        }
    };

    ...
}

Utilización III

  • Extender clase actividad
if (bound){
    bService.codigo = 3;
    int res = bService.multiplica();
}

unbindService(connection);

Lifecycle

23 - Bound Service

By androidjedi

23 - Bound Service

  • 463