Bir Android Hizmeti birden çok kez başlatılırsa ne olur?


120

Aşağıdaki koda sahipsem:

Intent intent = new Intent(this,DownloadService.class);     
for(int i=0;i<filesArray.length;i++){        
     startService(intent);          
}

Bu kodda DownloadServicegenişler IntentService.

Yani şimdi aradığımda startService(intent)bu, her startService(intent)çağrıldığında yeni bir hizmet başlattığım anlamına mı geliyor yoksa bu bir DownloadServicekez çalıştırıldığı anlamına mı geliyor ve sonra her startService(intent)aradığımda farklı bir başlangıç ​​kimliğiyle farklı bir amaçtan geçecek.

Bu mantıklı mı ve bunlardan hangisi geçerli?

Yanıtlar:


167

Hizmet yalnızca bir durumda çalışacaktır. Ancak, hizmeti her başlattığınızda onStartCommand()yöntem çağrılır.

Bu burada belgelenmiştir


1
Teşekkürler. Ayrıca orada şöyle yazıyor: "startService () yöntemi hemen geri döner ve Android sistemi hizmetin onStartCommand () yöntemini çağırır. Hizmet zaten çalışmıyorsa, sistem önce onCreate () öğesini, ardından onStartCommand () öğesini çağırır." Dolayısıyla, hizmet zaten çalışıyorsa, sistem onCreate () yöntemini atlayacak ve yalnızca onStartCommand () 'ı çağıracak mı yoksa ne?
bytebiscuit

Gerçekten bilmiyorum, ama durumun bu olduğundan oldukça eminim ( onCreate()hizmet zaten oluşturulmuşsa aramamak için çok mantıklı ). Her Log.i()iki geri aramaya da bir koyup koymadığınızı ve LogCat'i kontrol edip etmediğinizi belirlemek kolay olmalıdır .
Philipp Wendt

Bunu yaptım ... ve garip bir şekilde, son startService () çağrısından sonra onCreate'i başlatıyor !!!
bytebiscuit

15
Bunun nedeni startService(), zaman uyumsuz olmasıdır. Yani, siz aramaları döngüye sokarken, hizmetin kendisi herhangi bir kaynak elde etmedi ve henüz başlamadı.
Philipp Wendt

1
@neelabh "hemen" değil, hizmeti başlatmak biraz zaman alıyor ve "for" döngüsü hala çalışıyor ve hizmeti tekrar tekrar arıyor, bu yüzden ilk denemeler henüz çalışan bir hizmet bulamayacak ... bu nedenle startService () yöntemi, hizmet başlangıcı tamamlanana kadar birkaç kez çağrılır. Lütfen kötü ingilizcemi affedin.
mzalazar

21

Kesinlikle doğru. Bir başvuru işlemi için yalnızca bir Hizmet örneği oluşturulur. Ve StartService();tekrar aradığınızda , o zaman sadece onStartCommand()çağrılır ve onStartCommand()yönteme yeni Niyet iletilir .

Not: onCreate() tekrar aranmaz.

bindService()Birden çok kez arama hakkında :

bindService()Birden çok kez çağırdığınızda , Hizmet için yalnızca bir örnek kullanılır ve Android Runtime aynı IBinder nesnesini istemciye döndürür.

Anlamına gelir, onBind()birden çok kez çağrılmaz. Ve sadece önbelleğe alınmış IBinder nesnesi döndürülür.


Does onStop()her gelen çağrısında lazım onStartCommand?
IgorGanapolsky

6
@IgorGanapolsky: Öncelikle, Service'te onStop () böyle bir geri çağırma yöntemi yoktur. Bir hizmeti durdurmak için stopService () veya stopSelf () 'i çağırmamız gerekir. Ve onStartCommand () birden çok amaç için birden çok kez çağrıldığında, sadece stopSelf () veya stopService () 'i yalnızca bir kez çağırmamız gerekir. IntentService kullanıyorsanız, onHandleIntent () 'den gelen isteğin başlangıç ​​kimliğini ileten stopSelfResult (int id)' i çağırmalısınız; bu, IntentService iş kuyruğuna yerleştirilen karşılık gelen başlangıç ​​kimliği isteğini durdurur. Bu yardımcı olur umarım.
Anish Mittal

8

Diğerleri için faydalı olabilecek yukarıdaki cevaplara biraz daha bilgi eklemek startId, onStartCommand()yöntemin aldığı her startService()çağrı için farklı olmasıdır .

Ayrıca, yukarıda belirtildiği gibi for döngüsünü yazarsak, yazılan kod onHandleIntent(), for döngüsü frekansı tarafından tanımlandığı kadar çok kez çalıştırılır, ancak sırayla ve paralel olarak değil.

Kavram, IntentServicebir iş kuyruğu oluşturur ve her startService()tetikleme isteği onStartCommand(), sırayla amacı iş kuyruğunda depolar ve ardından amacı tek tek iletir onHandleIntent().


2

Göre doc :

StartService () yöntemi hemen döndürür ve Android sistemi hizmetin onStartCommand () yöntemini çağırır. Hizmet zaten çalışmıyorsa, sistem önce onCreate () öğesini ve ardından onStartCommand () öğesini çağırır.

ve

Hizmeti başlatmak için birden çok istek, hizmetin onStartCommand () öğesine birden çok karşılık gelen çağrıya neden olur. Ancak, hizmeti durdurmak için yalnızca bir istek (stopSelf () veya stopService () ile) gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.