Android'de hizmetleri uygularken START_STICKY
ve START_NOT_STICKY
uygularken arasındaki fark nedir ? Herkes bazı standart örneklere işaret edebilir mi?
Android'de hizmetleri uygularken START_STICKY
ve START_NOT_STICKY
uygularken arasındaki fark nedir ? Herkes bazı standart örneklere işaret edebilir mi?
Yanıtlar:
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_INTENT
iş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.
START_NOT_STICKY
?
START_REDELIVER_INTENT
gibidir START_NOT_STICKY
. Bunun yerine böyleSTART_STICKY
Fark:
sistem öldürüldükten sonra hizmetinizi yeniden oluşturmaya çalışacaktır
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;
}
START_REDELIVER_INTENT
. START_STICKY
Son uygulamalar tarafından uygulamayı test ettim ve öldürdüm. Sonra hizmeti hatırlıyor. Ama bir START_REDELIVER_INTENT
daha asla aramadı. Neden?
Dokümantasyon START_STICKY
ve START_NOT_STICKY
oldukça basittir.
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
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şturmaContext.startService(Intent)
.onStartCommand(Intent, int, int)
birnull
Intent 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:
N
alarmı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