2012-07-21 20 views
13

Android newbee aquí, tengo un código que quiero ejecutar cuando mi aplicación de Android se inicia por primera vez. Comprueba la versión de la base de datos local y descarga una nueva versión si la versión actual no está actualizada. Lo he estado metiendo en la creación de mi primera actividad, bastante seguro de que tiene que haber un lugar mejor para poner esto. ¿Alguna recomendación de algún lugar donde pueda llamarla una vez al inicio?¿Dónde insertar el código para el inicio de la aplicación?

+0

¿Por qué dices que debería haber un lugar mejor para poner el código de inicio? OnCreate() debe hacer exactamente lo que usted desea. – Snailer

+0

Realice una actividad de pantalla de carga y agregue el código de verificación de su versión. –

+1

Snailer Si dejo el código en la actividad y luego tengo que suspender o volver a crear la actividad, ese código se llama una y otra vez. – tobylang

Respuesta

23

Puede escribir una clase de aplicaciones personalizadas (se extienden desde android.app.Application).onCreate anular para especificar lo que sucede cuando se inicia la aplicación:

public class MyApplication extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 

     // Do something here. 
    } 
} 

A continuación, tendrá que registrar su clase personalizada en el archivo de manifiesto:

<application ... android:name="fully.qualified.MyApplication"> 

Editar:

En respuesta a David Cesarino, estoy en desacuerdo con el propósito de la clase Application. Si confía en Activity 's onCreate, entonces, ¿qué impide que se convierta en la misma gran clase de propósitos misceláneos ... si necesita que suceda algo al iniciar la aplicación, debe escribir ese código en alguna parte; y el Activity probablemente se volverá más abarrotado porque también tiene que realizar la lógica específica Activity. Si te preocupa el desorden, separa la lógica en otras clases y llámalas desde el Application. Usar el SharedPreferences para determinar si la lógica debe ejecutarse o no parece ser más una solución a un problema que ya se ha resuelto.

Dianne Hackborn parece estar refiriéndose a los datos, no a la lógica, en lo que estoy totalmente de acuerdo. Las variables estáticas son mucho mejores que las variables de nivel de aplicación ... un mejor alcance y seguridad de tipo hacen que la facilidad de mantenimiento/legibilidad sea mucho más fácil.

+0

Obviamente, el 'SharedPreferences' era un ejemplo de la pregunta extraña en los comentarios (ni siquiera es parte de la respuesta). No estoy diciendo que necesite persistir la versión de la base de datos (o lo que sea) a 'SharedPreferences', ya que ya está" persistente "en la base de datos (para usar en' onUpgrade', * por ejemplo *). Sobre el uso de la clase de aplicación para realizar comprobaciones de bases de datos desde el principio, simplemente aceptemos estar en desacuerdo. Gracias por la respuesta. – davidcesarino

+0

Entendido, no quise centrarme en el aspecto 'SharedPreferences', sino en el requisito de decir: ' if (someCondition) { // Ejecutar algo. } ' Para mí, para eso se creó la 'Aplicación' ... Supongo que son solo dos formas de verlo, y como dijiste ... aceptas estar en desacuerdo. –

+0

¡No se preocupe, no hay problemas! :-) – davidcesarino

3

En primer lugar, un vistazo a la Activity lifecycle.

Respondiendo a su pregunta, se puede poner el código en cualquiera de esos métodos "puesta en marcha", dependiendo de lo que quiere hacer y, sobre todo importante, cuando desea disparar eso. Por lo que pidió, onCreate es el lugar razonable.

Lo he estado pegando en la oncreate de mi primera actividad, bastante seguro de que tiene que haber un lugar mejor para poner esto.

Y eso por qué? Cualquier código tiene un entrada punto, ¿verdad? En las actividades de Android, simplemente es onCreate (de nuevo, consulte el enlace anterior para obtener más información). Además del manejo de eventos, que son respuestas a eventos que suceden fuera de la secuencia principal de llamadas, pones cosas en onCreate.

Si le preocupa que el método sea enorme, ese es otro problema. Resuma su código mejor, digo. Para verificar las cosas preliminares, las personas generalmente proporcionan una actividad de "carga" antes de comenzar la actividad principal de la aplicación.

Editado:

Esta es una continuación de lo drumboog propuesta, ya que mi comentario comenzó a crecer en complejidad a ser "sólo un comentario".

Personalmente, evitaría extender la clase Application por la única razón de ejecutar código desde el principio, más aún un código que no es tan sensible en prioridad (bases de datos de versiones). La clase Application se utiliza principalmente como una manera fácil de mantener el estado entre Activity 's, no como una forma de 'hacer todo'. En resumen, creo que la clase Application es comúnmente abusada.

Para lo que desee, podría perfectamente alcanzar ese código de llamada en ActivityonCreate. Eso reduce la complejidad, porque he visto personas rellenar Application hasta que se convierta en una gran clase de códigos misceláneos. Y eso es un no-no para el mantenimiento, con problemas de lógica propios.

Además, si realmente quieres otra solución, completamente desasociado con la IU, deberías pensar en implementar un Service (pero no creo que sea necesario para eso).

Ambos those concerns were previously addressed by Dianne Hackborn (o lo que obtuve de su mensaje).

+0

Y aún así, casi siempre hay mejores formas de persistir el estado (estática etc.). He contado con los dedos de una mano cuántas veces amplié la clase 'Application'. – davidcesarino

+0

Gracias lo intentaré :) – tobylang

+0

De nada. Siéntase libre de preguntar cualquier otro detalle. – davidcesarino

Cuestiones relacionadas