Vinculante para ejecutar el servicio (después de finish ()) / callback Handler

Una vez más una pregunta sobre LocalServices. ¿Cómo puedo (re) vincularme a un servicio existente, después de onDestroy ()?

El problema: estoy obligando a un servicio y comenzar el servicio de una actividad. Estoy publicando objetos ejecutables en el Binder, para una devolución de llamada (actualización de una barra de progreso) en la interfaz de usuario. Cuando cierra esta actividad, el sistema operativo podría terminar el ciclo de vida y destruir la actividad, llamando onDestroy (), ¿no? Yo simular esto, llamando finish () en el método onPause (). Así que una vez que vuelva a iniciar la Actividad, ¿cómo enlazar con el MISMO Servicio de nuevo? Pensé que los servicios son Singelton, pero cuando estoy tratando de volver a enlazar, obtengo otra referencia de carpeta. Así que binder.callbackHandler.post(binder.progressHandler); Todavía tiene la referencia a la vieja carpeta / devolución de llamada / progresoHandler, no a mi nuevo. Incluso el Constructor del Servicio se llama de nuevo!

¿Hay alguna solución para tener una barra de progreso, consiguiendo actualizado por objetos de devolución de llamada del servicio (trabajando). Cierre / onDestroy () la Actividad. ¿Volver y continuar la barra de progreso?

Mi código es muy grande, pero recreó el Szenario:

  public class MyService extends Service { private final LocalBinder binder = new LocalBinder(); public class LocalBinder extends Binder implements TestRunServiceBinder { private Handler callbackHandler; private ServiceStartActivity.RunOnServiceProgress onProgress; @Override public void setActivityCallbackHandler(Handler messageHandler) { callbackHandler = messageHandler; } @Override public void setServiceProgressHandler(RunOnServiceProgress runnable) { onProgress = runnable; } public void doSomething(){ _doSomething(); }; private void _doSomething(){ while(...){ //do this a couple of times (could take up to 10min) binder.callbackHandler.post(binder.progressHandler); wait() } } } 

_

 public class ServiceStartActivity{ private final Handler messageHandler = new Handler(); private ServiceConnection mTestServiceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { testRunBinder = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { testRunBinder = (TestRunServiceBinder) service; testRunBinder.setActivityCallbackHandler(messageHandler); testRunBinder.setServiceProgressHandler(new RunOnServiceProgress()); } }; @Override protected void onStart() { super.onStart(); // bind to the Service final Intent serviceIntent = new Intent(ServiceStartActivity.this, MyService.class); getApplicationContext().bindService(serviceIntent, mTestServiceConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); getApplicationContext().unbindService(mTestServiceConnection); } public class RunOnServiceProgress implements Runnable { @Override public void run() { //do something on the UI! } } } 

Lo entiendo ahora. La solución es la llamada explícita startService(serviceIntent); Antes de enlazar con el servicio mediante getApplicationContext().bindService(serviceIntent,mTestServiceConnection, Context.BIND_AUTO_CREATE);

Razón: Al iniciar un servicio con bindService() , se convierte en un servicio bindService() un

Se ejecuta sólo siempre y cuando otro componente de aplicación esté vinculado a él.

Si inicia un Servicio con startService() puede

Puede ejecutarse en el fondo indefinidamente,

Por lo tanto, si tiene una barra de progreso en la interfaz de usuario y desea que continúe actualizándola, debe iniciar su servicio y vincularla y desenlazarla en onResume () / onPause (). Pero sea carfull: Puesto que usted comenzó el servicio manualmente, usted debe también pararlo manualmente . La forma más sencilla de hacerlo es llamar a stopSelf() una vez que el servicio lo hizo.

Esta almación cubre una vinculación adecuada de una Actividad con, por ejemplo, una barra de progreso al mismo Servicio incluso después de que la actividad se destruya o después de un cambio de orientación.

  • Android: uso de la red en un servicio
  • ¿Cómo reiniciar automáticamente un servicio incluso si la fuerza del usuario lo cierra?
  • PopUp diálogo Android de hilo de fondo
  • Android: superposición en la ventana sobre las actividades de una tarea
  • El archivo AIDL no genera un archivo Java
  • Cómo reiniciar el servicio después de que la aplicación sea eliminada de las tareas recientes
  • Animar ImageView dentro de WindowManager en un servicio de Android
  • Gran uso de memoria en las notificaciones
  • Detener el servicio hasta que se pueda establecer conexión a Internet
  • Facturación en aplicaciones de Android y servicio bindService
  • IOS equivalente al servicio de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.