que - Ejemplo de servicio bind/unbind(android)
programacion android pdf 2018 (3)
¿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.
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:
<receiver android:name="MyReciever" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
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 objetoIBinder
es nuestro controlador que accede a todos los métodos deService
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.
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);
}