2012-10-10 30 views
5

Quiero iniciar un Service cuando se lanza la aplicación en lugar de una Actividad; y luego dicho Servicio lanzará an Activity. Necesito hacer esto porque mi aplicación debe ejecutarse SIEMPRE, y cuando digo SIEMPRE me refiero a SIEMPRE. Y la única forma en que he podido evitar que el sistema operativo elimine mi aplicación es iniciando un servicio como Adhesivo y si Android mata mi Actividad o mi Servicio, los reiniciaré de inmediato.Iniciar el servicio desde el inicio de la aplicación, no la actividad

Encontré esto question pero la respuesta principal parece bastante torpe, ¿alguien tiene una mejor idea?

PD: Sé que esto no parece una aplicación muy amigable, pero este es un escenario de investigación muy específico y no está destinado a usuarios regulares, es decir, el teléfono solo se utiliza para este fin; pero incluso si la memoria está dedicada a mi aplicación, Android sigue matándolo de vez en cuando ... Cualquier duda que pudiera haber tenido sobre el supuesto esquema estricto de administración de memoria de Android ahora se ha ido.

+0

Así que quieres saber cómo iniciar un servicio? – keyser

+0

@roadkarom: no hay ** UI ** en la actividad. No ** PUEDE SER ** UI en actividad, y esto hace una gran diferencia. –

+0

Ahora noto eso. Mi error. –

Respuesta

10

En general La actividad NO tiene que mostrar ninguna IU, normalmente lo hace, pero NO es obligatorio. Entonces, simplemente puede establecer el punto de inicio de la aplicación para su actividad "invisible". Y medios invisibles, ya sea con temas como

android:theme="@android:style/Theme.NoDisplay" 

o simplemente su código no hará ningún setContentView() y cuando es el trabajo está hecho en su onCreate(), iniciar otra actividad y termina éste con finish() - y ninguna interfaz de usuario debería salir hacia afuera desde que la actividad - de esa manera usted puede beneficiarse fácilmente de hacer su trabajo en la actividad subclase (que puede ser más fácil para algunas tareas) y aún así no es necesario ningún interfaz de usuario:

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 

    // [... do your job here...] 

    // we're done, so let's jump to another acitivity 
    // this can be skipped if you do not want to jump anywhere 

    Intenet intent = new Intent(....) 
    ... 

    try { 
     startActivity(intent); 

     // finish him 
     finish(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
+0

¿Pero entonces ES obligatorio comenzar una actividad? ¿No puedes saltarte ese paso? –

+2

@rodkarom: los iconos del iniciador siempre están relacionados con las actividades. Por lo tanto, si desea que un icono del iniciador active un servicio, el icono del iniciador debe iniciar una actividad que active el servicio. Esto, por supuesto, asume que cuando "cuando se inicia la aplicación" te refieres a "cuando el usuario toca un ícono del iniciador", ya que las "aplicaciones" no se "lanzan" en Android. – CommonsWare

+0

El truco es que para iniciar el sistema de la aplicación se invocará ese elemento que tiene derecho a 'intento-filtro' asociado. Teóricamente, como el filtro de intenet se puede asignar a actividad, servicio o difusión, cualquier objeto de ese tipo podría lanzarse (sin embargo, no intenté nada al lado de la actividad para los intentos del iniciador). Aún así, no veo ningún problema para iniciar la actividad sin UI solo para hacer mi trabajo de configuración. –

Cuestiones relacionadas