2010-02-20 18 views
21

Bir etkinliğe bağlanmak için bir etkinliğin en iyi yerinin ne olduğunu bilmek ister misiniz? onResume() numaralı telefondan ve ayrıca onCreate() numaralı telefondan örnekler gördüm. Ben onPause()onPause() içinde ben bir servisten yapacağım çünkü onCreate() içine koyarak bir sorun olup olmadığını kendimi soruyordu, ben hizmetten ayrılırsam bir serviceConnectionLeak alamadım. Şimdi Ana Sayfa Düğmesine basıp Ana Ekrana geçersem, Görev Yöneticisi'nden Etkinliğe geri döndüğümde Etkinlik hizmetten ayrılırsa, onCreate() çağrılmayacak ve eğer kod bir hizmetten bir NullPointerException alacağım. Yalnızca onResume() ve onPause()'da bağlarım varsa ve bu sorunu çözmüyorsam, bu sorunla karşılaşmam. Haklı mıyımOnCreate() veya onResume() içinde Hizmet Bağlama

+0

OnCreate() 'da, onDestroy()' da açmayı ve onPause() 'da açmayı engelleyen bazı örneklere tekrar bakıyordum. Ama hala benim için net değil. – Harold

cevap

44

Genellikle de bunu tavsiye ederim ya onCreate()/onDestroy() veya istediğiniz semantik bağlı/onStop()onStart():

  • senin Activity istiyor Service öyle süre boyunca etkileşim edilecek olursa (örneğin, sizin için bir ağdan bazı verileri alabilir ve hazır olduğunda verileri geri gönderir ve arka plandayken buna izin vermek istersiniz, böylece kullanıcı geri dönerse, verileri hazırlarsınız), sonra onCreate()/onDestroy() muhtemelen uygun. Buradaki semantiklerin, Activity'un çalıştığı tüm zamanın Service olmasını gerektirdiğini, yani bu Service başka bir işlemde çalışıyorsa, o zaman ağırlığını artırdınız ve arka plandayken öldürülmesini daha olası hale getirdiğinizi unutmayın. .

  • sizin Activity görünür, sonra onStart()/onStop() uygun iken Service ile çalışan tek ilgileniyorsa. Bu, Activity öğenizin, kullanıcı bıraktığında (ve artık görünmüyorsa) Service'dan çıkacak ve geri dönüşü tekrar başlatıp yeniden başlatıldığında yedeklenecek demektir.

Genellikle/bağlama yapıyor tavsiye onResume() ve onPause() yılında unbind olmaz. Bunlar genellikle Service'u (ve dolayısıyla yükünüzü) kullandığınız miktarı önemli ölçüde azaltmaz ve aslında her etkinlik geçişinde bir duraklama ve özgeçmiş olduğu için, bu mümkün olduğunca hafif tutmak istediğiniz bir kod yoludur. Burada yapmak, diğer beklenmedik olumsuz sonuçlara neden olabilir: Örneğin, uygulamanızda birden fazla Activity s aynı Service'a bağlanırsa, bu etkinliklerin ikisi arasında bir geçiş olduğunda, Service da kullanılabilir ve Activity geçerli olarak duraklatılmış olarak yeniden oluşturulabilir bir sonraki devam edilir.Ayrıca

bu çiftleri (örneğin, vb alıcıları kayıt, Service s bağlanma) gereksinim elde etmek ve daha sonra serbest bırakılması için uygun çift sağlamak için olması amaçlanmıştır (/ onResume()onPause()onCreate()/onDestroy(), onStart()/onStop()) onlar ihtiyaç duyulmadan önce doğru bir şekilde elde edilir ve artık ihtiyaç duyulmadığında serbest bırakılır (ve sızdırmaz).

+0

Bunu üstüne koymayacaksanız,() yeterli olur mu? 'if (listAdapter == null) {listAdapter = new MyListAdapter (getApplicationContext());} – likejiujitsu

+0

ama bazen @hackbod, ... aynı zamanda stopService() ve aynı zamanda unbindService() throuh onStop() bırakırken aynı hatayı kaldı Bu hizmete bağlanan her aktivitenin yöntemi. ve ... hatayı düzeltmek için, sadece dene-ve-yakaladım ve ... çözdüm! : D – gumuruh

0

Dedikleriniz doğru. Çoğu durumda onResume()'a kayıt olmak ve onPause() numaralı telefondan kayıt olmak isteyeceksiniz. Eğer onCreate() ve onDestroy() modellerini kullanırsanız, duraklatıldığında, kötü bir vatandaş olan güncellemeler için kayıt olmaya devam edersiniz. onCreate()'a kayıt olur ve onPause() kayıt defterine kaydolamazsanız, görevi sürdürdüğünüzde kayıt silinir, ki bu kesinlikle istediğiniz gibi değildir.

+0

"OnCreate() ve Destroy() öğelerinde kullanıyorsanız, duraklatıldığında, kötü bir vatandaş olan güncelleştirmeler için yine de kaydolacaksınız." Bu ifadeden alıntı yapabileceğiniz bir kaynağınız var mı? – CommonsWare

+0

Bu benim anlayışımdı ama ben size erteliyorum. Bu doğru değil mi? – RickNotFred

+2

Eh, benim bildiğim genel bir açıklama olarak değil. Bir gereksinim olarak bir vis servisine "güncellemeler için kayıt" kavramı vardır. Etkinliğiniz ekrandan çıktığında, özellikle açmak isteyebileceğiniz belirli servisler (ve belki de kapanabilir). Başkaları olmayabilir. Örneğin, GPS'e bağlı bir servis kapanmak isteyebilir, ancak sadece uygulama uzun bir süre ekran dışında ise kullanıcı, GPS düzeltmesini yeniden elde etmek zorunda kaldığı için daha az sinirlenir. Şimdi, benimkinden daha iyi bir tavsiye olabilir, bu yüzden bir kaynağın olup olmadığını sordum. – CommonsWare

İlgili konular