START_STICKY ve START_NOT_STICKY


Yanıtlar:


371

Her iki kod da yalnızca telefonun belleği dolduğunda ve yürütme işlemi bitmeden servisi öldürdüğünde geçerlidir. START_STICKYİşletim Sistemine, yeterli belleğe sahip olduktan sonra hizmeti yeniden oluşturmasını ve onStartCommand()boş bir amaçla yeniden çağırmasını bildirir . START_NOT_STICKYİşletim Sistemine hizmeti yeniden oluşturmayı rahatsız etmemesini söyler. Ayrıca START_REDELIVER_INTENTişletim sistemine hizmeti yeniden oluşturmasını ve aynı amacı yeniden göndermesini söyleyen üçüncü bir kod da vardır onStartCommand().

Dianne Hackborn'un bu makalesi, bunun arka planını resmi belgelerden çok daha iyi açıkladı.

Kaynak: http://android-developers.blogspot.com.au/2010/02/service-api-changes-starting-with.html

Buradaki anahtar kısım, işlev tarafından döndürülen ve sistem çalışırken çalışırken öldürülmesi durumunda hizmetle ne yapması gerektiğini söyleyen yeni bir sonuç kodudur:

START_STICKY temel olarak, hizmetin "başlatıldığı" bırakıldığı ve daha sonra sistem tarafından yeniden başlatılacağı önceki davranışla aynıdır. Platformun önceki sürümlerinden tek fark, işlemi öldürüldüğü için yeniden başlatılması durumunda, onStartCommand () işlevinin bir sonraki örneğinde hiç çağrılmak yerine boş bir Niyet ile çağrılmasıdır. Bu modu kullanan hizmetler her zaman bu durumu kontrol etmeli ve uygun şekilde ele almalıdır.

START_NOT_STICKY, onStartCreated () öğesinden döndükten sonra, işlemin teslim edilecek kalan başlatma komutları olmadan öldürülmesi durumunda, hizmetin yeniden başlatılmak yerine durdurulacağını söylüyor. Bu, yalnızca kendilerine gönderilen komutları yürütürken çalışması amaçlanan hizmetler için çok daha mantıklıdır. Örneğin, bir ağ alarmını yoklamak için alarmdan her 15 dakikada bir servis başlatılabilir. Bu işi yaparken öldürülürse, durdurulmasına ve bir sonraki alarm çaldığında çalışmaya başlamanız en iyisidir.

START_REDELIVER_INTENT, START_NOT_STICKY gibidir, ancak hizmetin işlemi belirli bir amaç için stopSelf () öğesini çağırmadan önce öldürülmesi dışında, bu amaç tamamlanıncaya kadar yeniden teslim edilir (bir miktar daha fazla denemeden sonra hala tamamlanamazsa, hangi noktada sistemden vazgeçer). Bu, yapılacak iş komutlarını alan ve gönderilen her komut için işi sonunda tamamladıklarından emin olmak isteyen hizmetler için kullanışlıdır.


1
Görev tanıtıcısına çift çağrı nasıl önlenir (intent, startId); hem onStart () hem de onStartCommand olarak adlandırılacak mı? iyi bir tasarım mı? Frank Leigh
Sazzad Hissain Khan

2
Öte yandan, hiçbiri belirtilmezse varsayılan bayrak nedir?
IgorGanapolsky

3
"Return super.onStartCommand (...);" hedef sdk sürümünüzün varsayılan olarak ECLAIR (API5 = 2.0) değerinden düşük olması durumunda START_STICKY_COMPATIBILITY döndürüldüğünü ve 2.0 ve üstü START_STICKY döndürüldüğünü göreceksiniz.
MikeL

1
"Kalan başlatma komutu olmayan" ile ne demek istiyorsun START_NOT_STICKY?
Malwinder Singh

3
Bunu kabul etmiyorum @FrankLeigh START_REDELIVER_INTENTgibidir START_NOT_STICKY. Bunun yerine böyleSTART_STICKY
CopsOnRoad

107

KISS cevabı

Fark:

START_STICKY

sistem öldürüldükten sonra hizmetinizi yeniden oluşturmaya çalışacaktır

START_NOT_STICKY

Sistem edecek değil o öldürdü sonra hizmetinizi yeniden oluşturmayı deneyin


Standart örnek:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

5
Bu aslında doğru ve kafa karıştırıcı değil. Bu, "servis öldürüldü" demekle ilgili bir hatadır, çünkü kişi, stopSelf veya stopService'e atıfta bulunduğunuzu düşünebilir; Yani cevabınızda kelime işlemini kullansan iyi edersin.
Ilya Gazman

Merhaba nasıl test edebilirim START_REDELIVER_INTENT. START_STICKYSon uygulamalar tarafından uygulamayı test ettim ve öldürdüm. Sonra hizmeti hatırlıyor. Ama bir START_REDELIVER_INTENTdaha asla aramadı. Neden?
Asif Mushtaq

@IlyaGazman Ben saygıyla katılmıyorum. Durduruldu ve öldürüldü çok farklı iki kelime. Bu cevap, konuyu basit ve anlaşılır bir şekilde doğru bir şekilde açıklar.
NoHarmDan

23

Dokümantasyon START_STICKYve START_NOT_STICKYoldukça basittir.

START_STICKY:

Bu hizmetin işlemi başlatılırken öldürülürse (geri döndükten sonra onStartCommand(Intent, int, int)), başlangıç durumunda bırakın, ancak bu teslim edilen amacı korumayın. Daha sonra sistem hizmeti yeniden oluşturmaya çalışacaktır. Çünkü başlangıç ​​durumundadır. , onStartCommand(Intent, int, int) yeni hizmet örneğini oluşturduktan sonra aramayı garanti eder ; hizmete teslim edilecek bekleyen başlatma komutları yoksa, null bir nesne ile çağrılır, bu yüzden bunu kontrol etmeye dikkat etmelisiniz.

Bu mod, arka plan müziği çalma hizmeti gibi bir hizmet gibi keyfi süreler boyunca açık bir şekilde başlatılacak ve durdurulacak şeyler için anlamlıdır.

Örnek: Yerel Hizmet Örneği

START_NOT_STICKY:

Bu hizmetin işlemi, başlatıldığında (geri döndükten sonra öldürülürse onStartCommand(Intent, int, int))ve hizmete sunulacak yeni bir başlangıç ​​amacı yoksa, hizmeti başlangıç ​​durumundan çıkarın ve gelecekteki açık bir çağrı gelene kadar yeniden oluşturma Context.startService(Intent) . onStartCommand(Intent, int, int)bir nullIntent ile çağrı almayacak, çünkü yayınlanmak üzere bekleyen bir niyet yoksa yeniden başlatılmayacak.

Bu mod, başlatılmasının bir sonucu olarak bazı işler yapmak isteyen şeyler için mantıklıdır, ancak bellek baskısı altında durdurulabilir ve daha sonra daha fazla iş yapmak için kendilerini tekrar başlatacaktır. Böyle bir hizmete örnek olarak bir sunucudan veri toplayan servis verilebilir: Nalarmın hizmetini başlatmasını sağlayarak her dakika yoklamak üzere bir alarm zamanlayabilir . Olduğu zamanonStartCommand(Intent, int, int) çağrıldığında, N dakika sonra yeni bir alarm zamanlar ve ağını yapmak için bir iş parçacığı oluşturur. Bu kontrol yapılırken işlemi durdurulursa, alarm çalıncaya kadar servis yeniden başlatılmaz.

Örnek: ServiceStartArguments.java


şanssız çocuklar .. Layman'ın sözleriyle belgeleri ilişkilendiremedim. Gerçek zamanlı bir senaryo ile ilişki kurmak istiyorum. Cihazda bir örnek göstermek istiyorum. böylece daha kolay anlayabilirler.
prago

START_STICKY ve START_NOT_STICKY onStartCommand () için yalnızca bir kez yürütülür ve çıkılır. U işaret etti örnek gitti, ama şüphem kaç kez onStartCommand () yürütülecektir. START_STICKY'yi geri çekersem ve yine de hizmeti yeniden oluşturmaya çalışırsam, hizmet onStartCommand'da çalışır mı ??
prago

hizmet yeniden oluşturulduğunda etkinliğe ne olur? Etkinlik de yeniden yaratılıyor mu?
fidye

Sanırım asla bilemeyeceğiz
Denny
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.