¿Por qué un servicio Android no es singleton cuando se prueba?

Al ejecutar un gran conjunto de testsuites, me di cuenta de que uno de mis servicios de Android no es singleton más. Se supone que un servicio de Android es singleton pero cuando se utiliza un ServiceTestCase mi recuento de referencia fue por encima de 1. (incrementado en onCreate, decrementado en onDestroy). Llamar startService o bindService de un testcase debería resultar en un segundo onBind o onStartCommand pero nunca debería resultar en un segundo onCreate antes del primer onDestroy.

¿Es esto porque la prueba unitaria está pasando por alto el Zygote? Y si es así, ¿cómo puedo arreglar esto?

Me di cuenta de que uno de mis servicios Android no es singleton más

Android Services es singleton sin importar si su inicio / lo enlazan bajo ambiente real de ejecución o bajo la prueba de instrumentación. Por singleton, me refiero a un objeto único vivo en el montón que puede tener referencias múltiples apuntan a ella.

Llamar startService o bindService de un testcase debería dar como resultado un segundo onBind o onStartCommand

Esto no es cierto, como se indica en la guía oficial de dev: "Múltiples clientes pueden conectarse al servicio a la vez.Sin embargo, el sistema llama al método onBind () de su servicio para recuperar el IBinder sólo cuando el primer cliente se vincula. El mismo IBinder a los clientes adicionales que se unen, sin llamar onBind () de nuevo. "

Pero nunca debe resultar en un segundo onCreate antes de la primera onDestroy

De acuerdo con la guía oficial de dev: "Si usted permite que su servicio sea iniciado y enlazado, entonces cuando el servicio ha sido iniciado, el sistema no destruye el servicio cuando todos los clientes se desvinculan. Llamando a stopSelf () o stopService (). "

Por lo tanto, el escenario detrás de las escenas es, por primera vez que llamar a servicio de inicio o enlazar, se llama al método Service.onCreate () (antes de llamar a OnStartCommand () o onBind ()) para crear un objeto único en el montón y una referencia A que se devuelve (count de referencia = 1), después de eso, cada vez que llama servicio de inicio o enlazar, Service.onStartCommand () se realiza sin crear nuevo objeto (llamando a Service.onCreate ()) en el montón Un segundo punto de referencia para el mismo objeto (ahora el recuento de referencia = 2), cada vez que se llama unbind, el recuento de referencia disminuye por uno, hasta que el conteo de referencia alcance a 0, Service.onDestroy () método se llama y finalmente limpiar el objeto en El montón.

Puede encontrar todos los detalles que he mencionado en cursiva desde la guía oficial de dev.

  • Uso del patrón de diseño Singleton para SQLiteDatabase
  • Android Volley error en getInstance (este) al agregar ImageLoader
  • Tiempo de vida único estático en Android
  • ¿Cuál es la diferencia entre "nuevo A ()" y "A.newInstance ()"?
  • Ciclo de vida de aplicaciones Android y singelton
  • Métodos estáticos o singleton, ¿cuál elegir?
  • Java.lang.IllegalStateException: La aplicación PagerAdapter cambió el contenido del adaptador sin llamar a PagerAdapter # notifyDataSetChanged android
  • Singletons vs. Contexto de la aplicación en Android?
  • Singletons no disponibles cuando la aplicación vuelve a la memoria
  • Android MediaPlayer Singleton
  • Singletons vs. Contexto de la aplicación en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.