Android onCreate veya onStartCommand hizmeti başlatmak için


106

Genellikle bir Android servisi oluşturduğumda onCreateyöntemi uygularım ama son projemde bu işe yaramıyor. Uygulamayı denedim onStartCommandve bu işe yarıyor gibi görünüyor.

Soru şudur: Bir hizmeti uygulamam gerektiğinde, hangi yöntem gereklidir? Hangi yöntemleri uygulamam gerekiyor? onCreate, onStartCommandveya ikisi birden? Ve her birinin rolü nedir?


onCreateher zaman ne olursa olsun çağrılır
IgorGanapolsky

Yanıtlar:


189

onCreate()Servicenesne somutlaştırıldığında çağrılır (yani: hizmet oluşturulduğunda ). Bu yöntemde yalnızca bir kez yapmanız gereken şeyleri yapmalısınız (yani: bazı değişkenleri ilklendirin, vb.). örneklenen nesne başınaonCreate() yalnızca bir kez çağrılacaktır .

Yalnızca bironCreate() şeyi yalnızca bir kez başlatmak istiyorsanız / buna ihtiyacınız varsa uygulamanız gerekir .

onStartCommand()bir istemci hizmeti kullanmaya her başladığında çağrılır startService(Intent intent). Bu, onStartCommand()birden çok kez aranabileceği anlamına gelir . Gerektiğinde bu yöntemde çok şey yapmalıyız her zaman bir istemci hizmetinizde bir şey ister. Bu, hizmetinizin ne yaptığına ve müşterilerle nasıl iletişim kurduğuna (ve tersi) bağlıdır.

Uygulama yapmazsanız , müşterinin geçtiği onStartCommand()bilgilerden herhangi bir bilgi alamazsınız ve hizmetiniz herhangi bir yararlı iş yapamayabilir.IntentonStartCommand()


6
Bir uygulama içinde aynı Hizmetin iki örneği olabilir mi?
jacktrades

1
@jacktrades Teorik olarak ve belgelere göre: Hayır. Ancak, Android'de gerçekten de belirli durumlarda bir Hizmetin birden çok örneğini oluşturacak bazı hatalar var gibi görünüyor. Ancak, dediğim gibi, bu bir hata ve bunu istediğimiz zaman güvenilir bir şekilde yeniden üretemedik. Neden soruyorsun?
David Wasser

3
@Mr_and_Mrs_D Bildiğim kadarıyla rapor edilen resmi bir hata yok. Ancak, bunun olduğuna dair birkaç rapor var ve bunun olduğunu bildiğim bir uygulamam var. Sorunu küçük ve tekrarlanabilir bir şeye indirgeyemedim, bu yüzden kendim bir hata bildirmedim. Belgeler, hizmetlerin tekil olduğunu açıkça belirtmiyor, ancak amaçlananın bu olduğu çok açık. 'StartService ()' için belgelere bakın: hizmet zaten çalışmıyorsa oluşturulacağını ve başlatılacağını, çalışıyorsa çalışmaya devam edeceğini
David Wasser

6
@Diffy Aradığınızda startService(), hizmet çalışmıyorsa, Android hizmet sınıfının bir örneğini oluşturur (bu bir hizmet nesnesidir) ve ardından onCreate()o nesneyi çağırır . Daha sonra onStartCommand()bu nesneyi çağıracaktır . Bir süre sonra tekrar ararsanız startService(), hizmet hala çalışıyorsa, Android yeni bir hizmet nesnesi oluşturmayacaktır. Bunun yerine, sadece onStartCommand()mevcut hizmet nesnesini çağıracaktır . Anlaşıldı mı?
David Wasser

1
Seni seviyorum! (y) sihir gibi çalıştı (y) çok basit ve iyi bir açıklama
Hilton Khadka

11

Hizmet, Etkinlik gibi davranırassociate Bir hizmetle bir kez yapmak istediğiniz her şey , onCreatebaşlatma gibi olacaktır.

ve startServiceservice kullanılarak her çağrıldığında . Aranacak. ve gerçekleştirmek için herhangi bir eylemi iletebilirsiniz. bir müzik çalar gibi, oynayabilir, duraklatabilir, eylemi kullanmayı bırakabilirsinizonStartCommand

Ve operation in servicebir eylem göndererek ve bunu alarak herhangi bir şey yaparsınızonStartCommand

onCreate İnşaatçı gibi çalışın.

Kısaca Düzenle

onCreate()sadece ilk kez aradığınızda arar , ServiceOysa onStartCommand()her aradığınızda arar startService. Müzik çalma, durdurma, duraklatma gibi bir eylem ayarlamanıza izin verir.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

Öyleyse, startService (intent) kullanarak bir servisi aradığımda, onCreate () çağrılmayacak mı? Bir 'hizmet nesnesi'nin ne olduğunu anladığımdan şüphem var çünkü her zaman bir hizmeti startSevice (niyet) ile başlattım.
Diffy

hizmet nesnesini doğru şekilde
başlattınız

startService (new Intent (this, ServiceName.class)) gibi hizmeti başlatın;
AndroidGeek

Ancak bu yönteme hizmeti örnekleme deniyor mu? O halde hizmet nesnesi nerede?
2014

Aktivite ve Hizmeti Android'de açmak için amaç kullanarak Aktivite ve Hizmeti çağırmanın bir yoludur. Hizmet nesnesi ile yapmak istediğiniz şeyi, niyetle de yapabilirsiniz. Verileri
Servise iletmek
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.