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! } } } 

One Solution collect form web for “Vinculante para ejecutar el servicio (después de finish ()) / callback Handler”

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.

  • El servicio de fondo de Android se está reiniciando cuando se cancela la aplicación
  • ¿Hay una alternativa onBackPressed () para un servicio?
  • Android - ¿Cómo decidir si ejecutar un servicio en un proceso separado?
  • NsdManager no resuelve varios servicios descubiertos
  • Android: Cómo detener el servicio de música de mi aplicación, si otra aplicación reproduce música.
  • Actualización de Textview en una actividad con servicio local
  • En servicio de facturación de aplicaciones que se mueren a veces
  • Cómo repetir la notificación diaria en el tiempo específico en androide a través del servicio de fondo
  • El micrófono Android no funciona cuando se utiliza por otra aplicación en el servicio de fondo
  • Actualizar Android ListView en Widget
  • Uso de Alarmmanager para iniciar un servicio en un momento específico
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.