2010-12-17 8 views
11

Todavía estoy fresco para Android y creo que la configuración siguiente funciona para iniciar mi servicio cuando se inicia la aplicación.¿Cómo lanzar un servicio de Android cuando se inicia la aplicación?

<service android:name=".PlaylistUpdaterService"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </service> 

Pero este no es el caso. ¿Qué me perdí?

Respuesta

8

Corrígeme si me equivoco, pero android.intent.category.Launcher es válido solo para Activity. Por lo tanto, no parece una forma válida de iniciar el servicio. Lo mismo se puede lograr si hace lo siguiente:

  • Crear actividad transparente que se utilizará sólo para iniciar el servicio
  • para esa actividad, que no es necesario especificar el diseño GUI. Por lo tanto, no es necesario configurarContentView() en la actividad onCreate(). Lo único que se necesita es poner

@android: Estilo/Theme.NoDisplay

bajo la etiqueta tema de esta actividad en AndroidManifest.xml.

  • empezar el Servicio desde onCreate() de su actividad.
  • llama finish() en onStart() de tu Actividad para cerrarlo.

Por lo tanto, su actividad será invisible para el usuario, en breve y nadie notará que se utilizó para comenzar el servicio.

+0

Este método bloquea la interfaz de usuario cuando se está ejecutando la actividad, pero dado que está configurada como translúcida, no se puede hacer nada. Hay una manera de evitar este bloqueo de interfaz –

+0

@ Noble6: actualicé mi respuesta para que quede más claro. Gracias por los valiosos comentarios. – Zelimir

+3

No es necesario utilizar una actividad, esto solo ralentizará el tiempo de inicio de sesión percibido de la aplicación debido a la sobrecarga de iniciar y detener una actividad. El enfoque a continuación de anular una aplicación es mejor.Sin embargo, si realmente quisiera comenzar con la actividad, sería mejor tener una actividad base que inicie el servicio como comportamiento predeterminado si el servicio aún no se ha iniciado y luego hacer que todas las actividades extiendan esa actividad base. –

19

¡Incorrecto! extienda la clase Application (IE haga su propio), luego en el método onCreate() haga esto.

//Service is below 
Intent serviceIntent = new Intent(getApplicationContext(), PlaylistUpdaterService.class); 
startService(serviceIntent); 

Y elimine ese intento de filtro de su declaración en el archivo de manifiesto. Dejarlo como

<service android:name=".PlaylistUpdaterService"> 

El filtro intención siguiente tiene que estar en su actividad de casa sólo

<intent-filter> 
    <action android:name="android.intent.action.MAIN" /> 
    <category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 

La razón de hacer esto es porque la clase Application se pone en marcha tan pronto como la aplicación es, y actúa como una especie de clase global que maneja el framework android.

En realidad, si desea que el servicio se ejecute cada vez que vuelva a la pantalla de inicio, debe comenzar el servicio en sus clases de origen onResume(). Al ponerlo en las aplicaciones onCreate(), solo se iniciará el servicio si el usuario se está iniciando por primera vez o después de que el proceso se haya ejecutado. O puede ponerlo en las clases de su casa onCreate() pero eso ni siquiera está garantizado para ejecutarse todo el tiempo.

+0

Usted dice mal, pero también establece la categoría de filtro de intención.LAUNCHER para la Actividad como lo hago. Además de eso, tu enfoque también es correcto. – Zelimir

+0

Este no es el enfoque adecuado si desea que su servicio se inicie solo una vez (en el inicio). El servicio se inicia cada vez que el usuario cambia de orientación. Estoy buscando una solución para esto también. – DerpyNerd

+3

@RobbieVercammen: si se está ejecutando un servicio, llamar para iniciar una segunda vez no hará nada. Este es el comportamiento predeterminado. –

Cuestiones relacionadas