2010-09-11 31 views
29

¿Cómo puedo asegurarme de que solo se crea una instancia de servicio?Crear solo una instancia de servicio (Android)

He comprobado que algunas funciones con el registro (WeatherService es la clase que se extiende de servicio):

Log.i(TAG, "Start Id:" + WeatherService.this.hashCode()); 
Log.i(TAG, "End Id:" + WeatherService.this.hashCode()); 

Da diferentes códigos hash incluso cuando estoy seguro de que la misma función se ejecuta dos veces (la descarga):

09-12 01:00:55.195: INFO/WeatherService(7222): Start Id:1137653208 
09-12 01:00:57.235: INFO/WeatherService(7222): Start Id:1137654296 
09-12 01:00:59.035: INFO/WeatherService(7222): Start Id:1138806536 
09-12 01:01:39.085: INFO/WeatherService(7222): End Id:1137654296 
09-12 01:01:39.265: INFO/WeatherService(7222): Start Id:1137654296 
09-12 01:02:22.175: INFO/WeatherService(7222): End Id:1137653208 
09-12 01:02:24.815: INFO/WeatherService(7222): End Id:1138806536 
09-12 01:02:24.836: INFO/WeatherService(7222): Start Id:1138806536 
09-12 01:02:40.275: INFO/WeatherService(7222): End Id:1137654296 

Estoy atando un Actividad para el servicio con:

bindService(new Intent(getApplicationContext(), WeatherService.class) 
           ,mServiceConnection, BIND_AUTO_CREATE); 

Y el servicio puede ejecutarse durante minutos hasta que se complete, por lo tanto, el servicio puede vincularse/crearse en muchas actividades

+0

También vea esta página, que me siento tiene una explicación útil también: http://stackoverflow.com/questions/2518238/does-startservice-create-a-new-service-instance-or- using-the-existing-one –

Respuesta

27

¿Cómo puedo asegurarme de que solo se crea una instancia del servicio?

Solo puede haber una instancia de un Service dado.

Da diferentes códigos hash incluso cuando estoy seguro de que la misma función se ejecuta dos veces (descargando).

Entonces this no es el Service. O bien, el servicio se destruyó y recreó entre registros.

y el servicio puede funcionar durante varios minutos hasta que se ha completado, por lo tanto, el servicio puede ser encuadernados a/ creado por muchas actividades

Entonces probablemente está siendo destruido y recreado la Service. Si necesita que el servicio se ejecute durante minutos, debe usar startService() y stopSelf() además de sus llamadas bindService() y unbindService(). O quizás no necesite enlazar en absoluto, en cuyo caso podría considerar usar un IntentService, ya que eso automáticamente le da un hilo de fondo en el que realizar sus descargas.

+0

¡Gracias por esta información! – Wroclai

+0

Cuando el trabajo finaliza, llamo a una devolución de llamada a la actividad, esta es la razón por la que uso bindService (usando AIDL). Ahora he intentado iniciar sesión al principio y al final, y está claro que no se completa/destruye antes de que se cree una nueva instancia. También utilicé WeatherService.this.hashCode(), donde WeatherService es la clase que extiende Service. –

+0

oh, ¿significa que se iniciará un solo servicio?si se vuelve a llamar, oncreate no se llamará, sino solo al inicio –

8

Experimenté una situación similar.
Si se ha escrito como sigue, la instancia se puede crear en una.

bindService(new Intent(getApplicationContext(), WeatherService.class), mServiceConnection, BIND_AUTO_CREATE); 

Intente escribir una vez de la siguiente manera.

getApplicationContext().bindService(new Intent(getApplicationContext(), WeatherService.class),mServiceConnection, BIND_AUTO_CREATE); 
+0

Esto era exactamente lo que me faltaba, porque parece que PUEDE iniciar un servicio varias veces (se suponía que debía mostrar un servicio cada cinco segundos, y mostraba 2, 3 y más brindis por segundo hasta que usé este truco, cada vez que utilicé bindService) ¡Gracias! – liltof

Cuestiones relacionadas