2010-06-05 3 views
13

Ich habe einen Android-Dienst, den ich gerne weiter ausführen würde, auch wenn die letzte Aktivität vom Stapel entfernt wurde oder der Benutzer etwas anderes gewählt hat.Wie kann ein Android-Dienst wissen, dass es an keine Aktivitäten gebunden ist?

Im Wesentlichen überwacht der Dienst Änderungen auf einem Remote-Server, und ich möchte eine Benachrichtigung generieren, wenn und nur wenn eine Aktivität aus der App nicht ausgeführt wird (oder sichtbar). Mit anderen Worten, ich möchte nicht, dass die Benachrichtigungen auftreten, während der Benutzer direkt mit der App interagiert.

Wenn der Benutzer direkt mit der App interagiert, wird der Dienst die Aktivität benachrichtigen und die entsprechenden UI-Elemente basierend auf den Änderungen aktualisieren. Ich habe vor, dies durch das Beobachtermuster zu implementieren.

Wie kann der Dienst wissen, wenn keine der Anwendungen Aktivitäten daran gebunden sind?

Danke, J

Antwort

-2

Wie kann der Dienst, ob keiner von apps Aktivitäten an sie gebunden sind?

Sie wissen, ob es keine Grenze Activities sind, ob Ihr Observer Liste leer ist.

+4

und wie sollten/können wir die Observer-Liste überprüfen? – Ewoks

+0

@Ewoks: Das hängt davon ab, wie Sie es implementiert haben. Sie werden feststellen, dass das OP dies nicht erklärt hat. Außerdem finden Sie in der oberen rechten Ecke der Seite eine Schaltfläche "Frage stellen". Es wird allgemein als schlechte Form angesehen, so alte Fragen und Antworten zu kommentieren - stellen Sie stattdessen eine neue Frage. – CommonsWare

25

Sie benötigen einen boolean mit dem onBind, onUnbind und onRebind Methoden verwenden:

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 nur aufgerufen, wenn alle Kunden getrennt haben. Also gebunden wird bleiben wahr bis alle Clients getrennt haben.

** HINWEIS: Bearbeitet basierend auf Feedback von Gil. **

+0

Das ist in Ordnung, wenn Sie wissen, dass Sie jemals nur einen gebundenen Client haben werden. Aber wenn Sie zwei oder mehr haben, wird es nicht funktionieren. Ändern Sie "bound" in einen int und behalten Sie die Anzahl der gebundenen Clients im Auge. Andernfalls, in Ihrem Fall, wenn es zwei verbundene Clients und bei Verbindungsunterbrechungen gibt, wird "gebunden" auf "falsch" gesetzt. – psiphi75

+1

@ psiphi75: onUnbind wird nur aufgerufen, wenn alle Clients die Verbindung getrennt haben, sodass Sie die Anzahl der gebundenen Clients nicht überwachen müssen. – SharkAlley

11

Ich kann SharkAlleys Antwort nicht kommentieren, also wiederhole ich hier.

Leider onBind() ist nicht aufgerufen jedes Mal, wenn ein Client verbindet. Siehe zum Beispiel Frau Hackborne Antwort hier: https://groups.google.com/d/msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ

Eine mögliche Lösung von onUnbind() true zurück ist und das Kennzeichen auf true sowohl auf onBind() und onRebind() (und falsch auf onUnbind()).

+1

Ich habe ein Testprojekt erstellt, um dies zu bestätigen und meine Antwort zu aktualisieren. Danke für die Rückmeldung. – SharkAlley

Verwandte Themen