¿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?
- Obtenga el contexto de aplicación de la clase singleton de no actividad
- OnSaveInstanceState con Singleton
- Usando Gson para deserializar a Json en un singleton
- Configuración del valor de propiedad Singleton en el Listado de Firebase
- Los datos estáticos guardados dentro de singleton son nulos a veces cuando se vuelve a la aplicación desde el fondo
- Servicio de Android Creación de una nueva instancia de clase Singleton
- Cómo declarar variables globales en Android?
- ¿Cuándo / por qué se destruye mi instancia de singleton de Java?
- Singleton se destruye
- Cómo separar la actividad principal y el selector de fechas con las propias clases
- Singleton con contexto en Android
- Acceso al objeto GoogleApiClient en Todas las actividades
- Android Singleton con un contexto global
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.
- Eclipse no puede encontrar Theme.Sherlock en ActionBarSherlock
- Android: ¿Cuánta memoria utiliza mi aplicación?