¿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,
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.
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; } }
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.