2011-11-17 11 views
6

Uso de Android 2.1+. Tengo un servicio que es asesinado de vez en cuando por el sistema operativo (debido a la presión de la memoria, supongo).Servicio Android anulado y variables estáticas

Este servicio mantiene algunos estados utilizando campos de clases de miembros estáticos. Estoy esperando que los campos estáticos mantengan sus valores a pesar de que el sistema operativo haya cancelado y reiniciado el servicio.

Pero parece que no sucede así. Después de un reinicio, las variables estáticas se restablecen al valor predeterminado. ¿Es lo que se supone que va a pasar? ¿Debería usar otra forma de mantener un estado persistente a pesar de matar/reiniciar?

Respuesta

6

Sí, esto es lo que sucede cuando se cancela el servicio. El programa se toma de la memoria, y cuando se vuelve a cargar en la memoria, se suponen todos los valores predeterminados para las variables estáticas. Dicho de otra manera, el código de bytes para su programa no puede cambiar de ejecución a ejecución.

Generalmente se considera malo usar variables estáticas para mantener el estado. Intente almacenarlos en un almacenamiento preestablecido, como una base de datos sqlite.

+1

También especificaría que, dado que los campos estáticos se restablecen, significa que el sistema operativo mata todo el proceso de la aplicación Java. Y sí, esto sucede de vez en cuando, consulte esta publicación - http://stackoverflow.com/questions/708012/android-how-to-declare-global-variables/4642069#4642069 –

+1

¿Realmente Android no proporciona medios para mantener la persistencia? estado que escribirlo para flashear todo el tiempo? (por ejemplo, no se garantiza que se llame a onDestroy !!!?) Mi servicio cambia de estado MUCHO y esto aumentaría el uso de la batería y acelerará el desgaste del flash si tengo que tocar el flash cada vez que cambia el estado. – Michael

+0

@Michael De la [documentación del método onDestroy] (https://developer.android.com/reference/android/app/Activity.html#onDestroy()): Nota: no cuente con este método que se llama como un lugar para guardar datos! Por ejemplo, si una actividad está editando datos en un proveedor de contenido, esas ediciones se deben confirmar en onPause() o onSaveInstanceState (Bundle), no aquí. –