2012-09-06 11 views
15

Ich schreibe einen Service für meine Android App und ich versuche zu verstehen, wie der Bindungsmechanismus funktioniert. Wenn ich meinen Dienst in der onCreate einer Aktivität binden, aber ich unbind es nicht in OnStop oder onDestroy, erhalte ich die Fehlermeldung:Was bedeutet es, eine Serviceverbindung zu verlieren?

android.app.ServiceConnectionLeaked: Service com.google.ipc.invalidation.ticl.android.AndroidInvalidationService has leaked ServiceConnection com.googl 
           e.i[email protected]4177f8f8 that was originally bound here 

meine Frage ist also: Was ist das Problem mit undichten eine Verbindung genau ist Was verhindere ich, indem ich meinen Service entbinde?

Antwort

33

, was geschieht, wenn Android OS Activity zerstört und stellt fest, dass A ServiceConnection noch zu einem laufenden Service binded, so müssen Sie den Dienst Unbind vor Ihrer Activity

+1

Zur Verdeutlichung: Das System verwendet das Bindungssystem, um zu wissen, ob ein Dienst noch verwendet wird oder nicht. Es ist besonders wichtig, wenn startService nicht aufgerufen wird, da es in diesem Fall das Framework ist, das es abbricht. Wenn also ein Dienst nicht aufgelöst wird, wenn die Aktivität zerstört wird, verhindert dies, dass das System dies effizient erledigt. – Teovald

41

Normalerweise Ihre App zu zerstören ist die einzige Anwendung, die Ihren Service zugreifen kann (oder einen Nutzen dafür haben). Wenn Sie Ihre App mit diesem Dienst weiterhin zerstören, hat dieser Dienst keinen Zweck mehr. Es wird in speicherintensiven Ressourcen existieren, aber nichts tun. Indem Sie Ihren Service aufheben oder beenden, wenn Sie fertig sind, geben Sie diese Ressourcen zurück, damit sie von anderen Apps verwendet werden können.

Denken Sie an ein Kind, das seine Spielsachen in einem Raum verteilt und dann geht. Alle anderen im Haus (die Eltern, Geschwister und Gäste) haben keinen Nutzen für sie und müssen um alles herumlaufen. Die Spielsachen sind einfach im Weg. Wenn das Kind sie weglegt, kann jeder den Raum für alles nutzen, was er will.

Hoffe, dass hilft!

+7

+1! Eine der hilfreichsten Antworten zum Thema, vor allem aufgrund der * großen * Analogie! – Swayam

+0

gute und leicht verständliche Antwort – Ranjit

+0

aber was ist, wenn ich will, dass es weiterläuft, während ich andere Aktivitäten verwende. Ich habe START_STICKY in meinem Dienst verwendet, um dies zu tun, aber wenn ich den Dienst entbinde würde aufhören .. (Es wird Daten von einem ble Gerät herunterladen) – JourneyWithAndroid

2

Die Dienste laufen noch, auch nachdem die Aktivität geschlossen wurde. Sie müssen also die Ressource in onStop oder onDestroy lösen.

Verwandte Themen