Android platformunda Service vs IntentService


774

Bir ile yapılabilir şeyin bir örneğini arıyorum IntentServicebir ile yapılamaz Service(ve tersi)?

Ayrıca IntentServicefarklı bir iş parçacığında çalışır ve Servicedeğil inanıyorum . Yani, görebildiğim kadarıyla, kendi iş parçacığı içinde bir hizmet başlatmak gibi bir IntentService. Bu doğru mu?


45
IntentService is used for short tasks (etc) and a service is for long onesbunu nereden okudun
njzk2

9
Ayrıca, IntentService için kaynak kodunu okumanızı öneririz. Ne olduğunu ve ne yaptığını oldukça netleştirir.
njzk2

1
Yorumunu gördükten sonra sorumu düzenledim.
roiberg


2
Önceki yorumda bağlantı (greg7gkb tarafından) harika bir okuma.
DSlomer64

Yanıtlar:


1348

Tejas Lagvankar bu konuda güzel bir yazı yazdı . Hizmet ve IntentService arasındaki bazı önemli farklar aşağıdadır.

Ne zaman kullanılır?

  • Servis hiçbir UI ile görevleri kullanılabilir, ama çok uzun olmamalıdır. Uzun görevleri yerine getirmeniz gerekiyorsa, Servis içinde iş parçacıkları kullanmanız gerekir.

  • IntentService genellikle Ana Konuya hiçbir iletişim ile uzun görevlerde kullanılabilir. İletişim gerekiyorsa, Ana İş parçacığı işleyicisini veya yayın amaçlarını kullanabilirsiniz. Başka bir kullanım durumu, geri çağrılara ihtiyaç duyulmasıdır (Niyeti tetikleyen görevler).

Nasıl tetiklenir?

  • Servis yöntemini çağırarak tetiklenir startService().

  • IntentService yeni bir iş parçacığı olarak çoğaltılır ve yöntem, bir Niyet kullanılarak tetiklendiğinde onHandleIntent()bu parçacığı üzerinde denir.

Tetiklenen

  • Servis ve IntentService herhangi bir iş parçacığı, etkinlik veya diğer uygulama bileşeninden tetiklenebilir.

Çalışıyor

  • Servis arka planda çalışır ancak uygulamanın ana Konu üzerinde çalışır.

  • IntentService ayrı iş parçacığı üzerinde çalışır.

Sınırlamalar / Sakıncalar

  • Servis uygulamasının Ana Konu engelleyebilir.

  • IntentService paralel görevleri çalıştıramazsınız. Bu nedenle, tüm ardışık amaçlar çalışan iş parçacığı için ileti kuyruğuna girer ve sırayla yürütülür.

Ne zaman durmalı?

  • Bir Hizmet uygularsanız , işi tamamlandığında stopSelf()veya ile arayarak hizmeti durdurmak sizin sorumluluğunuzdadır stopService(). (Yalnızca ciltleme sağlamak istiyorsanız, bu yöntemi uygulamanız gerekmez).

  • IntentService çağrıya asla bu nedenle tüm başlangıç istekleri ele edildikten sonra hizmeti durdurur stopSelf().


11
kısa ve tatlı, ancak CommonsWare'in puanları da dahil olmak üzere cevabınızı düzenlerseniz daha iyi olur, çünkü birçok insan kabul edilmiş veya en çok oylanan cevapları okur
Shirish Herwade

12
@Darpan Service, arka planda uzun süreli işlemler gerçekleştirebilen ve bir kullanıcı arabirimi sağlamayan bir uygulama bileşenidir. Bir hizmet, barındırma işleminin ana iş parçacığında çalışır. Hizmet kendi iş parçacığını oluşturmaz ve ayrı bir işlemde çalışmaz (aksi belirtilmedikçe). Bu, hizmetiniz CPU yoğun bir işlem veya engelleme işlemi yapacaksa (MP3 çalma veya ağ oluşturma gibi), bu işi yapmak için hizmet içinde yeni bir iş parçacığı oluşturmanız gerektiği anlamına gelir.
José Juan Sánchez

8
"IntentService ana iş parçacığından tetiklenmelidir." Emin misiniz? MainActivity onCreate () içinde yeni bir iş parçacığından (aşağıdaki kod) bir IntentService çağırdığımda, hala benim için çalışıyor. new Thread (yeni Runnable () {@Override public void run () {Intentent = new Intent (context, HelloIntentService.class); startService (intent);}}). start ();
Ashok Bijoy Debnath

9
@AshokBijoyDebnath Haklısın! Hizmetler ve IntentServices herhangi iplik, etkinlik veya diğer uygulama bileşeninden başlatılabilir. Bu sorunu çözmek için cevabın metnini düzenledim. Düzenleme önerileriniz için teşekkür ederiz! :)
José Juan Sánchez

2
Sorun değil, devam et!
José Juan Sánchez

165

Birisi bana bir ile IntentServiceyapılabilecek ve a Serviceve başka bir yolla yapılamayacak bir şey örneği gösterebilirse .

Tanım olarak, bu imkansız. Java ile yazılmış IntentServicebir alt Servicesınıftır. Dolayısıyla, herhangi bir şey bir IntentServiceyapar, bir Servicekodun ilgili bitlerini o dahil ederek, yapabileceği IntentServicekullanımlar.

Bir hizmetin kendi iş parçacığı ile başlatılması IntentService'i başlatmak gibidir. Değil mi?

A'nın üç temel özelliği IntentServiceşunlardır:

  • arka plan iş parçacığı

  • Intentteslim edilen dizilerin otomatik kuyruğu onStartCommand(), yani arka plan iş parçacığında Intentişleniyorsa onHandleIntent(), diğer komutlar sıralarını beklerken sıraya girer

  • sıra boş IntentServiceolduğunda stopSelf(), çağrısıyla otomatik kapanma

Bunların herhangi biri ve tümü, Serviceuzatılmadan uygulanabilir IntentService.


6
Biraz geç oldu ama bunu bulma am Serviceile gördü startServiceyalnızca ANR-- atmadan önce yaklaşık 10 saniye boyunca çalışabilir bir IntentServicebu sınırlama görünmüyor bir niyet yayın ile başladı
edthethird

16
@ edthethird: Bunun nedeni, ana uygulama iş parçacığını bağlamanızdı. Dahil olmak üzere tüm bileşenleri üzerinde tüm yaşam döngüsü yöntemleri, onStartCommand()a Service, ana uygulama iş parçacığı üzerinde denir. Kullanıcı arayüzünüzü dondurmadan bu ipliği birkaç milisaniyeden fazla bağlayamazsınız ve eğer birkaç saniye alırsanız, bir ANR'nin eşdeğer hizmetini alırsınız.
CommonsWare

3
yup çok erken yorum yaptım. Bunun onStartCommandyerine işi yapıyordum onHandleIntent- onStartCommandUI iş parçacığında çalıştırılıyor gibi görünüyor , ancak ayrı bir iş parçacığı onHandleIntentyürütme için üretildi .
edthethird

3
@IgorGanapolsky: yapılacak daha fazla iş yoksa, geri döndükten IntentServicesonra kendisini çağırır onHandleIntent().
CommonsWare

1
Sorun İngilizce değil, programlama. Örneğin, "Ben uygulamayı KAPATMADIM" kesin bir tanımı yoktur, bu yüzden bu gerçekleştiğinde size ne olduğunu söyleyemem. Ben de nasıl "ben KAPALI app" ile ilgili "1 saat sonra indirecektir" bilmiyorum. "1 saat sonra indirilecek" için minimum tekrarlanabilir bir örnek sağlayabileceğiniz ayrı bir Yığın Taşması sorusu sormayı düşünebilirsiniz . Orada, "uygulamayı KAPATMADIM" in ne anlama geldiğini ayrıntılı olarak açıklayabilirsiniz (örneğin, kullanıcı uygulamayı kapatmak için ne yapar?).
CommonsWare

39

Hizmet

  • Tarafından çağrı startService()
  • Herhangi birinden tetiklendi Thread
  • Çalışıyor Main Thread
  • Ana (UI) iş parçacığını engelleyebilir. Uzun görev için her zaman servis içindeki ipliği kullanın
  • Görev tamamlandığında, hizmeti arayarak stopSelf()veyastopService()

IntentService

  • Uzun bir görev gerçekleştirir, genellikle iletişim gerekiyorsa ana iş parçacığı ile iletişim kuramaz HandlerveyaBroadcastReceiver
  • Aracılığıyla çağır Intent
  • Tarafından tetiklendi Main Thread
  • Ayrı iş parçacığında çalışır
  • Görev paralel olarak çalıştırılamıyor ve aynı çalışan iş parçacığında birden çok amaç Sıraya alınıyor.

19

Tekerleği yeniden icat etme

IntentService , aynı amaçla kasten yapılmış olduğu anlamına gelen Service sınıfını genişletir .IntentService

Peki amaç nedir?

`` IntentService'in amacı, işimizi endişe etmeden arka plan görevlerini yürütmeyi kolaylaştırmaktır

  • İşçi iş parçacığının oluşturulması

  • İşleme çoklu isteğini tek tek sıraya alma ( Threading)

  • Yok etmek Service

Yani HAYIR , bir Servicekişinin yapacağı herhangi bir işi IntentServiceyapabilir. Gereksinimleriniz yukarıda belirtilen kriterlere uyuyorsa, bu mantığı Servicesınıfta yazmak zorunda değilsiniz . Yani tekerleği yeniden icat etme çünkü IntentServiceicat edilen tekerlek.

Ana fark

IntentService ayrı bir iş parçacığı üzerinde çalışırken hizmet UI iş parçacığında çalışır

IntentService'i ne zaman kullanıyorsunuz?

Bir Faaliyetin kapsamının ötesinde var olan tek tek birden fazla arka plan görevi gerçekleştirmek istediğinizde, o zaman IntentServicemükemmeldir.

Nasıl IntentServiceyapılırService

UI iş parçacığı üzerinde bir normal servis çalışır (varsayılan örneğin UI iş parçacığı üzerinde herhangi bir Android Bileşen tipi çalışır Activity, BroadcastReceiver, ContentProviderve Service). Tamamlanması biraz zaman alabilecek bir iş yapmanız gerekiyorsa, bir iş parçacığı oluşturmanız gerekir. Birden fazla istek durumunda, uğraşmanız gerekecektir synchronization. IntentServicebu görevleri sizin yerinize yapan bazı varsayılan uygulamalar verilir. Geliştirici sayfasına
göre

  1. IntentService Çalışan İş Parçacığı oluşturur

  2. IntentServiceonHandleIntent()metoda tek tek istek gönderen bir İş Kuyruğu oluşturur

  3. İş olmadığında yöntemi IntentServiceçağırırstopSelf()
  4. onBind()Null yöntemi için varsayılan uygulama sağlar
  5. WorkQueue'ya ve sonunda da istek onStartCommand()gönderen varsayılan uygulamaIntentonHandleIntent()

15

Kabul edilen cevaba puan ekleme:

Android API'sında IntentService kullanımına bakın. Örneğin:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

Uygulamanız için bir IntentService bileşeni oluşturmak için IntentService'i genişleten bir sınıf tanımlayın ve içinde, onHandleIntent () yöntemini geçersiz kılan bir yöntem tanımlayın.

Ayrıca, IntentService kaynak koduna bakın, onStartCommand gibi yapıcı ve yaşam döngüsü yöntemleri ...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

Birlikte hizmet vermek AsyncTask, yükün çok büyük olmadığı birçok kullanım durumu için en iyi yaklaşımlardan biridir. veya yalnızca IntentSerivce'yi genişleten bir sınıf oluşturun. Android sürüm 4.0 tüm ağ işlemleri arka plan sürecinde olmalıdır aksi takdirde uygulama derleme / derleme başarısız. parçacığı kullanıcı arayüzünden ayırın. AsyncTask sınıfı, UI iş parçacığından yeni bir görevi başlatmanın en basit yollarından birini sağlar. Bu konuyla ilgili daha fazla tartışma için blog yayınına bakın

dan Android geliştiricileri kılavuzunda :

IntentService, istek üzerine asenkron istekleri (Intents olarak ifade edilir) işleyen Hizmetler için temel bir sınıftır. İstemciler startService (Niyet) çağrıları yoluyla istek gönderir; hizmet gerektiği şekilde başlatılır, her bir Niyeti yönetir, sırayla, bir işçi iş parçacığı kullanarak ve iş bitince kendini durdurur.

IntentService'te kullanılan tasarım deseni

: Bu "çalışma kuyruğu işlemcisi" deseni genellikle bir uygulamanın ana iş parçacığından görevleri boşaltmak için kullanılır. IntentService sınıfı, bu kalıbı basitleştirmek ve mekanikle ilgilenmek için vardır. Kullanmak için IntentService'i genişletin ve onHandleIntent (Intent) uygulayın. IntentService, Intents'i alır, bir işçi iş parçacığı başlatır ve hizmeti uygun şekilde durdurur.

Tüm istekler tek bir iş parçacığı üzerinde işlenir - gerektiği kadar sürebilir (ve uygulamanın ana döngüsünü engellemez), ancak aynı anda yalnızca bir istek işlenir.

IntentService sınıfı, bir işlemi tek bir arka plan iş parçacığında çalıştırmak için basit bir yapı sağlar. Bu, kullanıcı arayüzünüzün yanıt verme yeteneğini etkilemeden uzun süren işlemleri gerçekleştirebilmesini sağlar. Ayrıca, bir IntentService çoğu kullanıcı arabirimi yaşam döngüsü olayından etkilenmez, bu nedenle AsyncTask'ı kapatacak koşullarda çalışmaya devam eder.

IntentService'in bazı sınırlamaları vardır:

Kullanıcı arayüzünüzle doğrudan etkileşim kuramaz. Sonuçlarını kullanıcı arayüzüne koymak için bir Etkinliğe göndermeniz gerekir. İş istekleri sırayla çalışır. Bir işlem bir IntentService içinde çalışıyorsa ve başka bir istek gönderirseniz, istek ilk işlem bitene kadar bekler. IntentService üzerinde çalışan bir işlem kesilemez. Ancak, çoğu durumda

IntentService, basit arka plan işlemleri için tercih edilen yoldur

**

Volley Kütüphanesi

Android ağ uygulamaları geliştirmek için voley- kütüphane adı verilen bir kütüphane var . Kaynak kodu GitHub'da halka açık.

Arkaplan işleri için en iyi uygulamalar için android resmi dokümantasyon : niyet hizmeti, iş parçacığı, işleyici, hizmet üzerinde daha iyi anlamaya yardımcı olur. ve ayrıca Ağ İşlemlerini Gerçekleştirme


1
Kısa cevap verebilirseniz, daha iyi olabilirdi.
eRaisedToX

12

'Android IntentService vs Service' gibi bir şeyi inceleyerek kapsamlı bir farklılık listesi bulacağınıza eminim.

Örnek başına daha önemli farklılıklardan biri de, IntentService'in iş bittikten sonra kendini bitirmesidir.

Bazı örnekler (hızlı bir şekilde oluşturulmuştur);

IntentService: Uygulamanızı açmanın başlangıcında bir grup resmi indirmek istiyorsanız. Bu bir defalık bir işlemdir ve her şey indirildikten sonra kendini temizleyebilir.

Hizmet: Web API çağrılarıyla uygulamanızla arka uç arasında sürekli iletişim kurmak için kullanılacak bir Hizmet. Mevcut göreviyle bitmiş olsa bile, daha fazla iletişim için hala birkaç dakika sonra olmasını istersiniz.


2
Biriyle diğeriyle yapılabilecek bir örnek bulamadım. bana yardım etmeyen bazı açıklamalar.
roiberg

1
Bu siteyi deneyin, iyi örneklerle temel Android kavramları hakkında çok iyi bir açıklama var vogella.com/articles/AndroidServices/article.html
Stefan de Bruijn

4
"Nasıl kullanılır" ın başka bir örneği. özellikle servis kullanıldığında ve intentervice olduğunda değil. Lütfen bana teorik bir örnek verin ve "nasıl kullanılacağı" ya da o metrenin diğer beğenileriyle bağlantı kurmayın. Ben hiçbir şey yapmadan benim için "çalışmak" için sormuyorum ben sadece zaten tüm bu gibi gördüm ve hala emin değilim.
roiberg

5
bu oldukça önemli bir fark. örneğin, sunucuyla kalıcı bağlantıyı sürdürmek için hizmet kullanıyorsanız, tüm görevlerini tamamladıktan hemen sonra sonlandırıldığı için intentervice'i kullanamazsınız
pelotasplus 20:13

24
Ben google zaman, beni buraya getiriyor. şimdi sonsuz bir döngü içerisindeyim.
Lou Morda

12

IntentService

IntentServicekendi iş parçacığında çalışır. Tamamlandığında kendini durduracak. Daha çok ateş gibi ve unut. Sonraki çağrılar kuyruğa alınır. Çağrıları sıraya almak için iyi. IntentServiceGerekirse birden fazla ipliği de çevirebilirsiniz - Bunu kullanarak elde edebilirsiniz ThreadPoolExecutor. Bunu söylüyorum çünkü birçok kişi bana "neden IntentServiceparalel yürütmeyi desteklemediğinden kullanıyorsunuz" diye sordu . IntentServicesadece bir iş parçacığı. İçinde ihtiyacınız olan her şeyi yapabilirsiniz - Birden fazla iplik bile döndürüyor. Tek uyarı, IntentServicebu çoklu iplikleri döndürdüğünüzde bitirmesidir. Bu konuların geri gelmesini beklemiyor. Buna dikkat etmelisin. Bu yüzden ThreadPoolExecutorbu senaryolarda kullanmanızı tavsiye ederim .

  • Senkronizasyon, yükleme vb. İçin iyi…

Hizmet

Varsayılan Serviceolarak ana iş parçacığında çalışır. İşinizi yapmak için bir işçi iş parçacığını döndürmeniz gerekir. serviceAçık bir şekilde durmanız gerekiyor . Uygulamanızdan uzaklaşıp bir Headless için daha fazla geri gelseniz bile arka planda bir şeyler çalıştırmanız gerektiğinde bir durum için kullandım service.

  • Gerekirse yine birden fazla iş parçacığı çalıştırabilirsiniz.
  • Müzik çalarlar gibi uygulamalar için kullanılabilir.

BroadcastReceiversGerekirse etkinliğinizle istediğiniz zaman iletişim kurabilirsiniz .


8

IntentService, arka planda ve ayrılmış bir iş parçacığında yürütülmesi gereken bir görevin yürütülmesini kolaylaştırmak için yapılan bir Hizmetin uzantısıdır.

IntentService başlar, bir iş parçacığı oluşturur ve görevini iş parçacığında çalıştırır. bir kez yapıldığında, her şeyi temizler. Aynı anda yalnızca bir IntentService örneği çalıştırabilir, birkaç çağrı kuyruğa alınır.

Kullanımı çok basittir ve örneğin bir şeyleri indirmek gibi birçok kullanım için çok uygundur. Ancak bunun yerine daha basit (basit değil) Hizmeti kullanmak istemenizi sağlayacak sınırlamalar vardır.

Örneğin, bir xmpp sunucusuna bağlı ve etkinliklere bağlı bir hizmet IntentService kullanılarak basitçe yapılamaz. Sonuç olarak IntentService öğelerini yok saymanız veya geçersiz kılmanız gerekir.


Görünüşe göre, arka planda gerçek bir uzun çalışan hizmet çalıştırmak isteyen çoğu insan IntentService hakkında bulmaya çalışıyor çünkü dokümanlar bunu yapmak için olduğu gibi görünüyor, Ama çoğunlukla yeni Konu kullanarak da olabilir (yeni Runnable ()). start (). diğer bir deyişle, "yeni bir iş parçacığı oluşturur" hakkında konuştuğunda, tek bir işlem için hareket etmez, bu da çoğu çalışanın Aktiviteden ayırmak istediklerinde yapması gereken şeydir. (çünkü sadece yumurtlama iplikleri zaten bir
astardır

intentService ayrıca iş parçacığının yaşam döngüsüyle de ilgilenir ve zamanlayıcıya yardımcı olan bir lüper kullanır. Ayrıca yalnızca bir örneğin çalıştığından emin olur ve diğer çağrıları sıralar.
njzk2

5

Birisi bana bir IntentServiceile yapılabileceğiniz ve a serviceve diğer yollarla yapılamayacağınız bir şeyin örneğini gösterebilirse .

IntentService Uzun Süreli Dinleme için kullanılamaz, XMPP Dinleyicileri için olduğu gibi, onun tek seferlik bir operatörü, işi yapın ve vedalaşın.

Ayrıca sadece bir iş parçacığı var, ancak bir hile ile sınırsız olarak kullanabilirsiniz.


4

A Serviceve a arasındaki Temel Fark IntentServiceaşağıdaki gibi tanımlanır:

Hizmet :

1.A Servicekullanıcı ihtiyaçları ayrı bir iş parçacığı oluşturmak ve bu iş parçacığı gerekli işi yapmak için .Peki varsayılan olarak, uygulamanın ana iş parçacığı üzerinde çalışır. (Burada varsayılan çalışan iş parçacığı kullanılabilir).

2.Bir seferde birden fazla istek sağlar. (Çoklu Diş Açma)

IntentService:

1.Şimdi, IntentServiceburaya gelmek , herhangi bir işlemi gerçekleştirmek için varsayılan bir işçi iş parçacığı mevcuttur. Unutmayın - onHandleIntent()Arka plan çalışmasını yapabileceğiniz her bir başlatma isteği için niyeti alan bir yöntem uygulamanız gerekir .

2.Ama aynı anda sadece bir istek sağlar.


3

Android IntentService ve Hizmet

1.Service

  • Bir Hizmet startService () kullanılarak çağrılır.
  • Bir Servis herhangi bir evreden çağrılabilir.
  • Bir Hizmet varsayılan olarak Uygulamanın Ana İş Parçacığında arka plan işlemlerini çalıştırır. Böylece Uygulamanızın kullanıcı arayüzünü engelleyebilir.
  • Birden çok kez çağrılan bir Hizmet birden çok örnek oluşturur.
  • Bir hizmetin stopSelf () veya stopService () kullanılarak durdurulması gerekir.
  • Android hizmeti paralel işlemler çalıştırabilir.

2. IntentService

  • Intent kullanılarak bir IntentService çağrılır.
  • IntentService yalnızca Ana iş parçacığından çağrılabilir.
  • IntentService, arka plan işlemlerini çalıştırmak için ayrı bir işçi iş parçacığı oluşturur.
  • Birden çok kez çağrılan bir IntentService birden fazla örnek oluşturmaz.
  • Kuyruk tamamlandıktan sonra IntentService otomatik olarak durur. StopService () veya stopSelf () öğesini tetiklemeye gerek yoktur.
  • Bir IntentService'te, birden çok intent çağrısı otomatik olarak Kuyruğa alınır ve sıralı olarak yürütülür.
  • IntentService, Hizmet gibi paralel çalışamaz.

Buradan Bakın

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.