2010-11-23 22 views
7

Si lo entiendo correctamente, bindService() con BIND_AUTO_CREATE iniciará un servicio y no se extinguirá hasta que todos los enlaces estén desagregados.Android: el servicio se detiene cuando se cierra Activity

Pero si bindService (BIND_AUTO_CREATE) en onCreate() y presiono el botón Atrás para cerrar la actividad , el servicio llama a Destroy() y también muere.

No llamo desvincular() en cualquier momento. Entonces, ¿eso significa que cuando la Actividad se destruyó, la unión también se destruyó y el servicio también se destruyó?

¿Qué sucede si quiero que el servicio esté siempre en ejecución, al mismo tiempo cuando la actividad comienza Quiero vincularlo para poder acceder al servicio?

Si llamo StartService() y luego bindService() en onCreate(), se reiniciará el servicio en cada inicio de actividad. (Que no quiero)

Entonces, ¿podría comenzar el servicio una vez y luego enlazar la próxima vez que inicie la actividad?

Respuesta

9

Debe usar startService para que el servicio no se detenga cuando se destruya la actividad que se une a él.

startService se asegurará de que el servicio se esté ejecutando incluso si se destruye su actividad (a menos que se detenga debido a restricciones de memoria). Cuando llame al startService, se llama al método onStart en el servicio. No reinicia (termina y comienza de nuevo) el servicio. Por lo tanto, depende de cómo implemente el método onStart en el Servicio. Sin embargo, el servicio onCreate solo se llama una vez, por lo que es posible que desee inicializarlo allí.

+2

¿Cómo me puedo comunicar con el servicio de mi actividad? Diga, quiero enviar notificaciones del servicio a la actividad cuando haya terminado algún trabajo. El servicio realiza algún trabajo periódicamente. – giga

+0

Llamo bindService() con BIND_AUTO_CREATE: el servicio se detiene cuando se cierra Activity; Llamo a startService(), está bien. Gracias. – songhir

+0

¿puedes por favor elaborar un poco sobre esto? Estoy enfrentando un problema con el servicio – Richa

-5

puede hacerlo con BroadcastReceivers. encontrará mucho en google cómo usarlos

4

¡Encontré una solución!

El problema es que cuando cierre su actividad y su servicio no esté configurado como un servicio en primer plano, el sistema de Android lo reconocerá como no utilizado y lo cerrará.

He aquí un ejemplo en el que he añadido una notificación:

void setUpAsForeground(String text) { 
    PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, 
      new Intent(getApplicationContext(), MainActivity.class), 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    mNotification = new Notification(); 
    mNotification.tickerText = text; 
    mNotification.icon = R.drawable.muplayer; 
    mNotification.flags |= Notification.FLAG_ONGOING_EVENT; 
    mNotification.setLatestEventInfo(getApplicationContext(), "MusicPlayer", 
      text, pi); 
    startForeground(NOTIFICATION_ID, mNotification); 

} 

(un servicio de primer plano es un servicio que está haciendo algo que el usuario es activamente consciente de (como la reproducción de música), y debe aparecer al usuario como una notificación. Es por eso que creamos la notificación aquí)

+0

Hubiera sido mejor si hubiera compartido el ejemplo completo, como ¿cuál es el método 'startForeground()'? –

+0

Un servicio de primer plano en Android es un servicio en segundo plano que se ejecuta incluso después de que se cierra la aplicación principal. toma (int id, Notificación notificación) como parámetros. –

+0

¿Puedes compartir su código? Actualízalo en tu respuesta si puedes. –

Cuestiones relacionadas