Ejemplo de servicio bind / unbind (android)

¿Puede darme un ejemplo simple de aplicación con servicio en segundo plano que utiliza métodos de vinculación / desvinculación para iniciarlo y detenerlo? Estuve buscando en Google durante media hora, pero esos ejemplos usan los métodos startService / stopService o son muy difíciles para mí. gracias.

Puedes intentar usar este código:

protected ServiceConnection mServerConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { Log.d(LOG_TAG, "onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName name) { Log.d(LOG_TAG, "onServiceDisconnected"); } } public void start() { // mContext is defined upper in code, I think it is not necessary to explain what is it mContext.bindService(intent, mServerConn, Context.BIND_AUTO_CREATE); mContext.startService(intent); } public void stop() { mContext.stopService(new Intent(mContext, ServiceRemote.class)); mContext.unbindService(mServerConn); } 

Agregue estos métodos a su actividad:

 private MyService myServiceBinder; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { myServiceBinder = ((MyService.MyBinder) binder).getService(); Log.d("ServiceConnection","connected"); showServiceData(); } public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } }; public Handler myHandler = new Handler() { public void handleMessage(Message message) { Bundle data = message.getData(); } }; public void doBindService() { Intent intent = null; intent = new Intent(this, BTService.class); // Create a new Messenger for the communication back // From the Service to the Activity Messenger messenger = new Messenger(myHandler); intent.putExtra("MESSENGER", messenger); bindService(intent, myConnection, Context.BIND_AUTO_CREATE); } 

Y puede vincularse al servicio mediante ovverriding onResume () y onPause () en su clase Activity.

 @Override protected void onResume() { Log.d("activity", "onResume"); if (myService == null) { doBindService(); } super.onResume(); } @Override protected void onPause() { //FIXME put back Log.d("activity", "onPause"); if (myService != null) { unbindService(myConnection); myService = null; } super.onPause(); } 

Tenga en cuenta que cuando se vincula a un servicio, solo se llama al método onCreate() en la clase de servicio. En su clase de Servicio necesita definir el método myBinder:

 private final IBinder mBinder = new MyBinder(); private Messenger outMessenger; @Override public IBinder onBind(Intent arg0) { Bundle extras = arg0.getExtras(); Log.d("service","onBind"); // Get messager from the Activity if (extras != null) { Log.d("service","onBind with extra"); outMessenger = (Messenger) extras.get("MESSENGER"); } return mBinder; } public class MyBinder extends Binder { MyService getService() { return MyService.this; } } 

Después de definir estos métodos, puede llegar a los métodos de su servicio en su Actividad:

 private void showServiceData() { myServiceBinder.myMethod(); } 

y finalmente puedes comenzar tu servicio cuando ocurra algún evento como _BOOT_COMPLETED_

 public class MyReciever extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals("android.intent.action.BOOT_COMPLETED")) { Intent service = new Intent(context, myService.class); context.startService(service); } } } 

tenga en cuenta que al iniciar un servicio se onCreate() y onStartCommand() en clase de servicio y puede detener su servicio cuando se produce otro evento por stopService () tenga en cuenta que su detector de eventos debe registrarse en su archivo de manifiesto de Android:

      

Primero que nada, dos cosas que debemos entender,

Cliente

  • Realiza una solicitud a un servidor específico

bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);

aquí mServiceConn es una instancia de la clase ServiceConnection (incorporada), en realidad es una interfaz que debemos implementar con dos (primero para la red conectada y segundo para la red no conectada) para monitorear el estado de la conexión de red.

Servidor

  • Se encarga de la solicitud del cliente y hace una réplica de la suya que es privada para el cliente que envía la solicitud y esta raplica de servidor se ejecuta en diferentes hilos.

Ahora en el lado del cliente, ¿cómo acceder a todos los métodos del servidor?

  • El servidor envía una respuesta con el Objeto IBinder . Entonces, el objeto IBinder es nuestro controlador que accede a todos los métodos de Service utilizando el operador (.).

.

 MyService myService; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { Log.d("ServiceConnection","connected"); myService = binder; } //binder comes from server to communicate with method's of public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } } 

Ahora cómo llamar al método que se encuentra en el servicio

 myservice.serviceMethod(); 

Aquí myService es object y serviceMethod es el método en servicio. y de esta manera la comunicación se establece entre el cliente y el servidor.