2010-06-05 18 views
13

Tengo un servicio de Android que me gustaría seguir funcionando incluso después de que la última actividad haya salido de la pila, o el usuario ha elegido hacer otra cosa.¿Cómo puede un servicio de Android saber que no está vinculado a ninguna actividad?

Esencialmente, el Servicio está a la escucha de los cambios en un servidor remoto, y me gustaría generar una Notificación si y solo si una Actividad de la aplicación no se está ejecutando (o es visible). En otras palabras, no quiero que las Notificaciones ocurran mientras el Usuario interactúa directamente con la aplicación.

En el caso en que el Usuario interactúe directamente con la aplicación, el Servicio notificará la Actividad y actualizará los elementos de la IU apropiados en función de los cambios. Planeo implementar esto a través del patrón Observer.

¿Cómo puede saber el Servicio si ninguna de las Actividades de Actividades está vinculada a él?

Gracias, J

Respuesta

-2

¿Cómo puede saber el servicio si ninguno de aplicaciones actividades están obligados a ella?

Usted sabe si hay ningún límite Activities si su lista Observer está vacía.

+4

y cómo debemos/podemos verificar la lista de observadores? – Ewoks

+0

@Ewoks: eso depende de cómo lo implemente. Notarás que el OP no explicó esto. Además, encontrará el botón "Preguntar" en la esquina superior derecha de la página. En general, se considera de mala calidad hacer comentarios sobre preguntas y respuestas tan antiguas como esta; en su lugar, haga una pregunta nueva. – CommonsWare

25

Es necesario utilizar un booleano con el onBind, onUnbind y métodos onRebind:

public boolean bound; 

@Override 
public Binder onBind(Intent intent){ 
    bound = true; 
    return myBinder; //declare and init your binder elsewhere 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    bound = false; 
    return true; // ensures onRebind is called 
} 

@Override 
public void onRebind(Intent intent) { 
    bound = true; 
} 

onUnbind sólo se invoca cuando todos los clientes se hayan desconectado. Por lo tanto, obligado se mantendrá true hasta que todos los clientes se hayan desconectado.

** NOTA: Editado en base a los comentarios de Gil. **

+0

Esto está bien si sabes que alguna vez tendrás un solo cliente vinculado. Pero si tienes dos o más, no funcionará. Cambie "bound" a un int y mantenga un registro del número de clientes enlazados. De lo contrario, en su caso, si hay dos clientes conectados y en desconexiones, "enlazado" se establecerá en "falso". – psiphi75

+1

@psiphi75: onUnbind solo se invoca cuando todos los clientes se han desconectado, por lo que no necesita realizar un seguimiento del número de clientes enlazados. – SharkAlley

11

No puedo comentar la respuesta de SharkAlley, así que la reproduzco aquí.

Desafortunadamente onBind() es no se llama cada vez que se conecta un cliente. Véase, por ejemplo, la respuesta de la Sra Hackborne aquí: https://groups.google.com/d/msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ

Una posible solución es devolver verdadero de onUnbind() y establecer el indicador de cierto tanto en onBind() y onRebind() (y falsa en onUnbind()).

+1

Creé un proyecto de prueba para confirmar esto y actualicé mi respuesta. Gracias por la respuesta. – SharkAlley

Cuestiones relacionadas