wake-up-neo.net

Android-Service: onBind (Intent) und OnUnbind (Intent) wird nur einmal aufgerufen

Ich habe die Aktivität und den Service. Wenn Activity gestartet wird, ruft es startService() auf, um diesen Service lebendig zu machen, selbst wenn Activity zerstört wird, und bindService(), um mit diesem Service zu kommunizieren.

bindService() gibt true zurück, mService.onBind() wird aufgerufen und ServiceConnection.onServiceConnected() wird auch aufgerufen. Alles funktioniert. 

Wenn ich meine Aktivität durch Drücken der Zurück-Taste zerstöre, ruft sie unbindService() auf und meine mService.onUnbind() wird aufgerufen. (Ich gebe false in dieser onUnbind() zurück.) 

Dann starte ich diese Aktivität erneut, bindService() gibt true zurück und dann wird mService.onBind()NICHT aufgerufen! Aber ServiceConnection.onServiceConnected() wird auch aufgerufen und alles funktioniert wieder.

Es sieht so aus, als würde sich Dalvik daran erinnern, was meine onBind() beim letzten Mal zurückgegeben hat, und ruft einfach nicht mehr onBind() auf. Wenn ich meine Aktivität wieder zerstöre, wird onUnbind()NICHT auch aufgerufen. 

Ich kann diesen Dienst mehrmals an meine Aktivität binden und die Bindung aufheben, aber diese Methoden werden nicht mehr aufgerufen, bis ich den Dienst zerstöre, indem ich stopService() entbinde und aufrufe.

In Docs kann ich keine Erklärung für dieses Verhalten finden. Umgekehrt zeigt diese Abbildung , dass onBind() und onUnbind() jedes Mal aufgerufen werden sollten, wenn Clients den Dienst binden und nicht. Diese Abbildung befindet sich am unteren Rand von this Dev Guide .

39
Dmitry Frank

Ich denke dies (von offiziellen Entwicklerleitfäden referenziert) kann alle Ihre Fragen erklären: 

Mehrere Clients können sich gleichzeitig mit dem Dienst verbinden. Das System ruft jedoch die onBind () - Methode Ihres Services auf, um IBinder nur abzurufen, wenn der erste Client eine Bindung eingeht. Das System liefert dann dasselbe IBinder an alle zusätzlichen Clients, die sich binden, ohne erneut onBind () aufzurufen.

51
yorkw

Sie finden es hier: https://developer.Android.com/guide/components/bound-services.html

Sie können mehrere Clients gleichzeitig mit einem Dienst verbinden. Das System speichert jedoch den IBinder-Service-Kommunikationskanal. Mit anderen Worten, das System ruft die onBind () - Methode des Services auf, um IBinder nur dann zu generieren, wenn der erste Client eine Bindung eingeht. Das System liefert dann dasselbe IBinder an alle weiteren Clients, die an denselben Dienst gebunden sind, ohne erneut onBind () aufzurufen.

0
Amol K