¿Cómo puedo compartir un servicio entre actividades sin que se reinicie?

Estoy escribiendo una aplicación SIP usando un SDK. Mi aplicación tiene muchas actividades y por lo tanto, inicializo y apago el SDK usando los métodos onCreate y onDestroy de un servicio para poder ejecutarlo durante la duración de mi aplicación (no solo una actividad individual).

La aplicación de ejemplo que estoy trabajando desde las llamadas startService y, a continuación, sólo filtra el servicio – no quiero hacer esto, pero no estoy seguro de que tengo una alternativa.

Lo que me gustaría hacer es enlazar al servicio utilizando Context.BIND_AUTO_CREATE en el método OnCreate de mi clase de base de actividad y desvincularlo en OnDestroy. Todas mis actividades se extienden de esto, así que tendría el servicio disponible en todas mis actividades.

¿Pero, qué sucede cuando la configuración cambia o cambio las actividades? ¿El servicio es agresivamente asesinado en el breve período entre actividades, o hay una garantía de que no lo hará? Si es el primero, ¿no es eso un poco lisiado el uso de los servicios? ¿Qué patrón de diseño debo utilizar para hacer que algo persista durante exactamente la vida de mi aplicación?

Me he dado cuenta de que estoy haciendo la pregunta equivocada. Estoy asumiendo que la Aplicación será destruida cuando el usuario termine con ella, lo que probablemente no lo hará, simplemente se sentará en el fondo, y también lo hará mi servicio. Creo que necesito un rediseño.

Además, si realmente quería seguir por ese camino (que ahora no lo hago), podría vincular el servicio a mi aplicación, entonces existiría durante toda la vida de la aplicación (que, como recordé, será indefinida a menos que El usuario lo mata o Android lo recupera). En este caso no es necesario llamar especialmente unbind, ya que el enlace se destruirá junto con la aplicación.

En Actividades, inicie el servicio utilizando startService() y también vincular al servicio. Esto mantendrá su servicio vivo si hay un cambio de configuración.

Desvincularse del servicio en el onDestroy() de sus Actividades. El servicio se seguirá ejecutando, ya que no lo inició.

Mantenga una variable de contador estática en su actividad de lanzador. Aumentarlo en 1 para el lanzamiento de otra actividad en su onCreate() y disminuirlo por uno en su onDestroy() . Por lo tanto, si se han abierto 3 actividades y suponiendo que se están manteniendo los otros 2 en backstack, contador estático es de tres. Ahora en onDestroy() de cada disminución del contador y comprobar si es cero, detener el servicio.

En mi FirstActivity ( Launcher ), tengo public static int counter = 0;

Luego en cada Actividad:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FirstActivity.counter++; } @Override protected void onDestroy() { super.onDestroy(); if (--FirstActivity.counter == 0) { stopService(new Intent(this, MyService.class)); } } 
  • Servicio MediaPlayer Android
  • ¿Este patrón de mensajería de Servicio de Actividad causa una pérdida de memoria?
  • ¿Cómo funcionan las aplicaciones de Android, como Facebook, WhatsApp, en primer plano sin notificación?
  • ¿Cómo se puede ejecutar servicio indefinidamente y también permitir la vinculación en android?
  • Uso de Job Scheduler en la API de Android <21
  • Iniciar un servicio de Thread.UncaughtExceptionHandler?
  • ¿Cómo detener / cancelar el administrador de alarmas en otra actividad?
  • Android - ¿Por qué se ejecutan varias instancias de este servicio
  • ¿Puede iniciar un IntentService en un proceso separado?
  • El servicio no se detiene incluso después de que el método onDestroy se llama en Android
  • Android: tener un servicio que se ejecuta todos los días a las 4 de la mañana
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.