2012-04-19 20 views
25

He leído mucho sobre el servicio de Android. Según tengo entendido, el ciclo de vida es:¿Por qué no hay método Service.onStop?

void onCreate() 
    void onStart(Intent intent) 
    ... 
void onDestroy() 

http://www.linuxtopia.org/online_books/android/devguide/guide/topics/fundamentals.html

pero no hay ningún método onStop. Preguntas:

  • ¿Por qué no hay un método de paro?
  • ¿Qué ocurre cuando se realiza una solicitud stopService en mi Servicio? (desde afuera, tal vez por Android mismo). ¿Puedo detectar este evento?
  • Me gustaría hacer cumplir (o al menos verificar) que mi servicio es un singleton dentro de un proceso. ¿Cómo puedo hacer esto (o Android hace cumplir esto detrás de escena)?

Para el contexto, tengo algunos recursos que me gustaría asignar y liberar mientras que el servicio se está ejecutando (en un "iniciado"), y otro conjunto de recursos que le gustaría asignar y liberar mientras que el servicio es un estado "creado".

Respuesta

49

Según tengo entendido, el ciclo de vida es:

onStart() ya no se utiliza durante unos años. onStartCommand() es el método del ciclo de vida actual.

¿Por qué no hay un método de parada?

Porque no hay necesidad de una.

¿Qué sucede cuando se realiza una solicitud stopService en mi Servicio?

Se le llamará con onDestroy().

¿Puedo detectar este evento?

Puede anular onDestroy().

Me gustaría hacer cumplir (o al menos verificar) que mi servicio es un singleton dentro de un proceso. ¿Cómo puedo hacer esto (o Android hace cumplir esto detrás de escena)?

Los servicios son simples naturales. Habrá 0 o 1 instancia de su servicio en un momento dado.

Para el contexto, tengo algunos recursos que me gustaría asignar y liberar mientras que el servicio se está ejecutando (en un "iniciado"), y otro conjunto de recursos que le gustaría asignar y liberar mientras que el servicio es un estado "creado".

El estado "creado" se utiliza tanto con el patrón de comandos (startService() y onStartCommand()) y el patrón de unión (bindService() y onBind()). Por lo tanto, si llama al startService(), su servicio estará puramente en el estado "creado", con suerte menos de un milisegundo.

+4

Tenga en cuenta que si llama a bindService con BIND_AUTO_CREATE, no se llamará a onDestroy() hasta que suelte – aaronvargas

+0

observé que 'onDestroy()' no se llama cuando el dispositivo se apaga. ¿Hay alguna otra devolución de llamada que pueda ser anulada en ese caso? – fiddler

+1

@fiddler: no hay garantía de que se llame a 'onDestroy()', en algunos casos (Force Stop, la aplicación se bloquea, la necesidad de emergencia de la RAM del sistema), no solo en el apagado. No hay devolución de llamada cuando Android acaba su proceso. * Específicamente * con respecto al apagado, podría intentar registrar un 'BroadcastReceiver' para [' ACTION_SHUTDOWN'] (https://developer.android.com/reference/android/content/Intent.html#ACTION_SHUTDOWN), pero lo haría no contar con tiempo para hacer algo significativo. – CommonsWare

Cuestiones relacionadas