2012-01-09 21 views
36

Etkinliğim ve Servisim var. Etkinlik başlatıldığında, bu Hizmet ile iletişim kurmak için Etkinlik yok olduğunda ve bindService() bu Hizmetin canlı olmasını sağlamak için startService() numaralı telefonu çağırır.Android Service: onBind (Intent) ve onUnbind (Intent) yalnızca bir kez çağrıldı

bindService() doğru döndürür, mService.onBind() adı verilir ve ServiceConnection.onServiceConnected() da denir. Tüm işler.

Geri tuşuna basarak Etkinliğimi yok ettiğimde, unbindService() numaralı telefonu ve mService.onUnbind() numaralı telefonu çağırıyorum. ,

Sonra tekrar bu Aktivite başlamak bindService() döner doğru (i. Bu onUnbind() içinde false dönmek) ve ardından mService.onBind() DEĞİL denilen olduğunu! Ama ServiceConnection.onServiceConnected() da denir ve hepsi tekrar çalışır.

Dalvik, son kez onBind() numaranın ne zaman döndüğünü hatırlıyor ve tekrar onBind() numaralı telefonu aramıyor. Etkinliğimi tekrar imha ettiğimde onUnbind() da değil da denir.

Bu Hizmet'i herhangi bir defaya kadar Etkinliğim'e bağlayabilir ve bu bağlantıyı kaldırabilirim, ancak stopService() numaralı telefonu açıp kapatarak Hizmeti imha edene kadar bu yöntemler artık çağrılmayacaktır.

Bu davranışla ilgili herhangi bir açıklama bulamıyorum. Tersine, this figure, istemcilerin her defasında Hizmet'i bağladığında ve sonlandırdığında her zaman onBind() ve onUnbind() belirtilmelidir. Bu rakam this Dev Guide'un altında bulunabilir.

cevap

47

Ben (resmi dev kılavuzundan başvurulan) this tüm sorguları açıklayabilir düşünüyorum:

Birden fazla müşteri aynı anda hizmete bağlanabilir. Ancak, sistem, yalnızca ilk istemci bağlandığında IBinder'ı almak için hizmetinizin onBind() yöntemini çağırır. Sistem daha sonra, aynı IBinder'ı, tekrar OnBind() 'i çağırmadan bağlayan tüm ek istemcilere teslim eder.

+21

oh teşekkürler. Maalesef bunu özledim. Ancak, onUnbind() 'de true olarak dönebileceğimi öğrendim ve sonra onRebind() ve onUnbind() bir sonraki istemci için çağrılacak. –

+18

Belgeler aslında yanıltıcıdır. Artık, onBind() işlevine yapılan çağrının yapılmadığını, ancak bu yalnızca birden çok istemci için geçerli olduğunu söylüyor. Dokümanlar ayrıca, "hizmetiniz başlatılır ve bağlayıcı kabul edilirse, sistem onUnbind() yönteminizi çağırdığında, bir istemcinin bir sonraki bağlandığında onRebind() öğesine bir çağrı almak isterseniz, isteğe bağlı olarak true olarak döndürebileceğinizi de söyleyebilirsiniz. servis (** onBind() **) çağrısı almak yerine. Yalnızca onBind() 'öğesine çağrı yok. Yine de belgelerin yanlış olduğu başka bir durum. – Malcolm

+0

@Malcolm'da çarpıştığınız için üzgünüm ... Binding and unBinding şeyler ile ilgili bir sorum var.Bu Servisin içine bir ServerSocket Thread koyarsam ve Etkinlik-A'da onStart() ve onStop() öğesini buna göre ciltleme ve bağlama ile yerleştiririm. Başka bir etkinliğe geçip tekrar bağlarsam yeniden yaratılır mı? ya da iş parçacığı hala sonuncu kalır mı? – gumuruh

0

Burada bulabilirsiniz: Aynı anda bir hizmete birden fazla müşteri bağlayabilirsiniz https://developer.android.com/guide/components/bound-services.html

. Bununla birlikte, sistem IBinder servis iletişim kanalını önbelleğe alır. Başka bir deyişle, sistem, yalnızca ilk istemci bağlandığında, IBinder üretmek için hizmetin onBind() yöntemini çağırır. Sistem daha sonra aynı IBinder'ı aynı hizmete bağlanan tüm ek istemcilere, onBind() öğesini tekrar çağırmadan teslim eder.

İlgili konular