Layanan vs IntentService di platform Android


774

Saya mencari contoh sesuatu yang bisa dilakukan dengan IntentServiceyang tidak bisa dilakukan dengan Service(dan sebaliknya)?

Saya juga percaya bahwa IntentServiceberjalan di utas yang berbeda dan Servicetidak. Jadi, sejauh yang saya bisa lihat, memulai layanan di dalam utasnya sendiri seperti memulai IntentService. Apakah itu benar?


45
IntentService is used for short tasks (etc) and a service is for long onesDimana Anda membaca itu ?
njzk2

9
juga, saya sarankan Anda membaca kode sumber untuk IntentService. Itu membuatnya sangat jelas apa itu dan apa yang dilakukannya.
njzk2

1
Saya mengedit pertanyaan saya setelah saya melihat Anda berkomentar.
roiberg


2
Tautan dalam komentar sebelumnya (oleh greg7gkb) adalah bacaan yang bagus.
DSlomer64

Jawaban:


1348

Tejas Lagvankar menulis posting yang bagus tentang subjek ini. Berikut adalah beberapa perbedaan utama antara Layanan dan IntentService.

Kapan menggunakannya?

  • The Jasa dapat digunakan dalam tugas-tugas tanpa UI, tetapi tidak boleh terlalu lama. Jika Anda perlu melakukan tugas panjang, Anda harus menggunakan utas dalam Layanan.

  • The IntentService dapat digunakan dalam tugas-tugas yang panjang biasanya dengan tidak ada komunikasi ke Main Thread. Jika komunikasi diperlukan, dapat menggunakan pengendali Thread Utama atau maksud siar. Kasus penggunaan lainnya adalah ketika panggilan balik diperlukan (Intent memicu tugas).

Bagaimana cara memicu?

  • The Jasa dipicu oleh metode meneleponstartService() .

  • The IntentService ini dipicu menggunakan Intent, itu memunculkan sebuah thread pekerja baru dan metode onHandleIntent()disebut di thread ini.

Dipicu Dari

  • The Jasa dan IntentService dapat dipicu dari setiap thread, kegiatan atau komponen aplikasi lainnya.

Berjalan

  • The Jasa berjalan di latar belakang tetapi berjalan pada Main Thread aplikasi.

  • The IntentService berjalan pada thread pekerja terpisah.

Keterbatasan / Kerugian

  • The Jasa dapat menghalangi Utama Thread aplikasi.

  • The IntentService tidak dapat menjalankan tugas secara paralel. Karenanya, semua maksud berurutan akan masuk ke antrian pesan untuk utas pekerja dan akan dieksekusi secara berurutan.

Kapan harus berhenti?

  • Jika Anda menerapkan Layanan , Anda bertanggung jawab untuk menghentikan layanan ketika pekerjaannya selesai, dengan menelepon stopSelf()atau stopService(). (Jika Anda hanya ingin memberikan penjilidan, Anda tidak perlu menerapkan metode ini).

  • The IntentService berhenti layanan setelah semua permintaan awal yang telah ditangani, sehingga Anda tidak perlu panggilan stopSelf().


11
singkat dan manis, tetapi lebih baik jika Anda mengedit jawaban Anda termasuk poin oleh CommonsWare, karena banyak orang hanya membaca jawaban yang diterima atau paling banyak dipilih
Shirish Herwade

12
@Darpan Layanan adalah komponen aplikasi yang dapat melakukan operasi yang berjalan lama di latar belakang dan tidak menyediakan antarmuka pengguna. Sebuah layanan berjalan di utas utama dari proses hostingnya. Layanan tidak membuat utas sendiri dan tidak berjalan dalam proses terpisah (kecuali jika Anda menentukan sebaliknya). Ini berarti bahwa, jika layanan Anda akan melakukan pekerjaan intensif CPU atau memblokir operasi (seperti pemutaran MP3 atau jaringan), Anda harus membuat utas baru dalam layanan untuk melakukan pekerjaan itu.
José Juan Sánchez

8
"IntentService harus dipicu dari Utas Utama." Apakah kamu yakin Di dalam MainActivity onCreate () saya, ketika saya memanggil IntentService dari Thread baru (kode di bawah), itu masih berfungsi untuk saya. new Thread (new Runnable () {@Override public void run () {Intent intent = new Intent (konteks, HelloIntentService.class); startService (maksud);}}). start ();
Ashok Bijoy Debnath

9
@AshokBijoyDebnath Kamu benar! The Layanan dan IntentServices bisa dimulai dari setiap thread, kegiatan atau komponen aplikasi lainnya. Saya baru saja mengedit teks jawaban untuk memperbaiki masalah ini. Terima kasih atas saran edit Anda! :)
José Juan Sánchez

2
Tidak masalah, lakukan saja!
José Juan Sánchez

165

Jika seseorang dapat menunjukkan kepada saya contoh dari sesuatu yang dapat dilakukan dengan IntentServicedan tidak dapat dilakukan dengan Servicedan sebaliknya.

Menurut definisi, itu tidak mungkin. IntentServiceadalah subkelas dari Service, ditulis dalam Java. Karenanya, apa pun yang IntentServicedilakukan, Servicedapat dilakukan, dengan memasukkan bit kode yang relevan yang IntentServicedigunakan.

Memulai layanan dengan utasnya sendiri seperti memulai IntentService. Bukan?

Tiga fitur utama dari IntentServiceadalah:

  • utas latar belakang

  • antrian otomatis dari Intents dikirim ke onStartCommand(), jadi jika seseorang Intentsedang diproses oleh onHandleIntent()di latar belakang, perintah lain mengantri menunggu giliran mereka

  • shutdown otomatis IntentService, melalui panggilan ke stopSelf(), setelah antrian kosong

Apa saja dan semua itu dapat diimplementasikan oleh Servicetanpa memperluas IntentService.


6
Sedikit terlambat, tetapi saya menemukan bahwa Servicedipanggil dengan startServicehanya dapat berjalan sekitar 10 detik sebelum melempar ANR - IntentServicedimulai dengan penyiaran niat tampaknya tidak memiliki batasan ini
edthethird

16
@edthethird: Itu karena Anda mengikat utas aplikasi utama. Semua metode siklus hidup pada semua komponen, termasuk onStartCommand()a Service, dipanggil pada utas aplikasi utama. Anda tidak dapat mengikat utas ini selama lebih dari beberapa milidetik tanpa membekukan UI Anda, dan jika Anda mengambil banyak detik, Anda akan mendapatkan layanan yang setara dengan ANR.
CommonsWare

3
ya saya berkomentar terlalu cepat. Saya melakukan pekerjaan onStartCommandalih-alih onHandleIntent- sepertinya onStartCommanddijalankan di utas UI, namun utas terpisah muncul untuk onHandleIntenteksekusi.
edthethird

3
@IgorGanapolsky: IntentServicememanggil itu sendiri, setelah onHandleIntent()kembali, jika tidak ada lagi pekerjaan yang harus dilakukan.
CommonsWare

1
Masalahnya bukan bahasa Inggris, tetapi pemrograman. Misalnya, "saya telah MENUTUP aplikasi" tidak memiliki definisi yang tepat, jadi saya tidak dapat memberi tahu Anda apa yang terjadi ketika itu terjadi. Saya juga tidak tahu bagaimana "saya telah TUTUP aplikasi" berkaitan dengan "akan mengunduh setelah 1 jam". Anda dapat mempertimbangkan untuk mengajukan pertanyaan Stack Overflow terpisah, di mana Anda dapat memberikan contoh minimal yang dapat direproduksi dari "akan mengunduh setelah 1 jam". Di sana, Anda dapat menjelaskan secara rinci apa arti "saya telah MENUTUP aplikasi" (misalnya, apa yang secara khusus dilakukan pengguna untuk menutup aplikasi?).
CommonsWare

39

Layanan

  • Diminta oleh startService()
  • Dipicu dari apa pun Thread
  • Berjalan Main Thread
  • Dapat memblokir utas utama (UI). Selalu gunakan utas dalam layanan untuk tugas panjang
  • Setelah tugas selesai, adalah tanggung jawab kami untuk menghentikan layanan dengan menelepon stopSelf()ataustopService()

IntentService

  • Melakukan tugas yang panjang biasanya tidak ada komunikasi dengan utas utama jika komunikasi diperlukan maka itu dilakukan oleh HandleratauBroadcastReceiver
  • Meminta melalui Intent
  • Dipicu dari Main Thread
  • Berjalan di utas terpisah
  • Tidak dapat menjalankan tugas secara paralel dan beberapa maksud di-antri pada utas pekerja yang sama.

19

Jangan menemukan kembali roda

IntentService memperluas kelas Layanan yang jelas berarti yang IntentServicesengaja dibuat untuk tujuan yang sama .

Jadi apa tujuannya?

Tujuan `IntentService adalah untuk membuat pekerjaan kita lebih mudah untuk menjalankan tugas-tugas latar belakang tanpa khawatir

  • Pembuatan benang pekerja

  • Mengantri pemrosesan beberapa permintaan satu per satu ( Threading)

  • Menghancurkan Service

Jadi TIDAK , Servicedapat melakukan tugas apa pun yang IntentServiceakan dilakukan. Jika persyaratan Anda termasuk dalam kriteria yang disebutkan di atas, maka Anda tidak perlu menulis logika itu di Servicekelas. Jadi jangan menemukan kembali roda karena itu IntentServiceadalah roda yang diciptakan.

Perbedaan utama

Layanan berjalan pada utas UI sementara IntentService berjalan pada utas terpisah

Kapan Anda menggunakan IntentService?

Ketika Anda ingin melakukan beberapa tugas latar belakang satu per satu yang ada di luar cakupan suatu Kegiatan maka IntentServicesempurna.

Bagaimana IntentServiceterbuat dariService

Layanan normal berjalan pada Thread UI (Setiap tipe Komponen Android berjalan pada thread UI secara default Activity, misalnya BroadcastReceiver,, ContentProviderdan Service). Jika Anda harus melakukan beberapa pekerjaan yang mungkin perlu waktu untuk diselesaikan, maka Anda harus membuat utas. Dalam hal banyak permintaan, Anda harus berurusan dengan synchronization. IntentServicediberikan beberapa implementasi standar yang melakukan tugas-tugas itu untuk Anda.
Menurut halaman pengembang

  1. IntentService menciptakan Worker Thread

  2. IntentServicemembuat Work Queue yang mengirimkan permintaan ke onHandleIntent()metode satu per satu

  3. Ketika tidak ada pekerjaan maka IntentServicepanggil stopSelf()metode
  4. Memberikan implementasi default untuk onBind()metode yang nol
  5. Implementasi default onStartCommand()yang mengirimkan Intentpermintaan ke WorkQueue dan akhirnya keonHandleIntent()

15

Menambahkan poin ke jawaban yang diterima:

Lihat penggunaan IntentService dalam API Android. misalnya:

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

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

Untuk membuat komponen IntentService untuk aplikasi Anda, tentukan kelas yang memperluas IntentService, dan di dalamnya, tentukan metode yang mengesampingkan onHandleIntent ().

Juga, lihat kode sumber IntentService, konstruktor dan metode siklus hidupnya seperti padaStartCommand ...

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

Layanan bersama AsyncTask adalah salah satu pendekatan terbaik untuk banyak kasus penggunaan di mana payloadnya tidak besar. atau hanya membuat kelas Memperluas IntentSerivce. Dari Android versi 4.0 semua operasi jaringan harus dalam proses latar belakang jika tidak kompilasi / pembangunan aplikasi gagal. pisahkan utas dari UI. Kelas AsyncTask menyediakan salah satu cara paling sederhana untuk menjalankan tugas baru dari utas UI. Untuk diskusi lebih lanjut tentang topik ini, lihat posting blog

dari panduan pengembang Android :

IntentService adalah kelas dasar untuk Layanan yang menangani permintaan asinkron (dinyatakan sebagai Maksud) berdasarkan permintaan. Klien mengirim permintaan melalui panggilan startService (Intent); layanan dimulai sesuai kebutuhan, menangani setiap Intent, pada gilirannya, menggunakan utas pekerja, dan berhenti sendiri ketika kehabisan pekerjaan.

Pola desain yang digunakan dalam IntentService

: Pola "prosesor antrian kerja" ini biasanya digunakan untuk membongkar tugas dari utas utama aplikasi. Kelas IntentService ada untuk menyederhanakan pola ini dan merawat mekanik. Untuk menggunakannya, perluas IntentService dan terapkan onHandleIntent (Intent). IntentService akan menerima Intents, meluncurkan utas pekerja, dan menghentikan layanan yang sesuai.

Semua permintaan ditangani pada utas pekerja tunggal - mereka mungkin memakan waktu selama diperlukan (dan tidak akan memblokir loop utama aplikasi), tetapi hanya satu permintaan yang akan diproses pada satu waktu.

Kelas IntentService menyediakan struktur langsung untuk menjalankan operasi pada utas latar belakang tunggal. Ini memungkinkannya untuk menangani operasi yang telah berjalan lama tanpa memengaruhi respons antarmuka pengguna Anda. Selain itu, IntentService tidak terpengaruh oleh sebagian besar peristiwa siklus hidup antarmuka pengguna, sehingga ia terus berjalan dalam keadaan yang akan mematikan AsyncTask.

IntentService memiliki beberapa batasan:

Itu tidak dapat berinteraksi langsung dengan antarmuka pengguna Anda. Untuk menempatkan hasilnya di UI, Anda harus mengirimkannya ke Aktivitas. Permintaan pekerjaan berjalan berurutan. Jika operasi berjalan di IntentService, dan Anda mengirimnya permintaan lain, permintaan menunggu sampai operasi pertama selesai. Operasi yang berjalan pada IntentService tidak dapat diganggu. Namun, dalam banyak kasus

IntentService adalah cara yang disukai untuk operasi latar belakang sederhana

**

Perpustakaan Volley

Ada perpustakaan bernama volley-library untuk mengembangkan aplikasi jaringan android . Kode sumber tersedia untuk umum di GitHub.

Dokumentasi resmi android untuk Praktik terbaik untuk pekerjaan Latar Belakang : membantu lebih memahami layanan maksud, utas, penangan, layanan. dan juga Melakukan Operasi Jaringan


1
Bisa lebih baik, jika Anda bisa memberikan jawaban singkat, sampai pada intinya.
eRaisedToX

12

Saya yakin Anda dapat menemukan daftar perbedaan yang luas hanya dengan googling sesuatu seperti 'Android IntentService vs Service'

Salah satu perbedaan yang lebih penting per contoh adalah bahwa IntentService berakhir dengan sendirinya begitu selesai.

Beberapa contoh (dibuat dengan cepat) dapat;

IntentService: Jika Anda ingin mengunduh banyak gambar di awal pembukaan aplikasi Anda. Ini adalah proses satu kali dan dapat membersihkan sendiri setelah semuanya diunduh.

Layanan: Layanan yang akan terus digunakan untuk berkomunikasi antara aplikasi Anda dan back-end dengan panggilan API web. Bahkan jika itu selesai dengan tugasnya saat ini, Anda masih menginginkannya sekitar beberapa menit kemudian, untuk komunikasi lebih lanjut.


2
Saya tidak menemukan satu contoh yang dapat dilakukan dengan satu dan tidak dengan yang lain. hanya beberapa penjelasan yang tidak membantu saya.
roiberg

1
Coba situs ini, ia memiliki banyak penjelasan bagus tentang konsep dasar Android dengan contoh-contoh yang layak vogella.com/articles/AndroidServices/article.html
Stefan de Bruijn

4
Ini contoh lain dari "cara menggunakan". tidak ketika secara spesifik menggunakan layanan dan ketika melakukan layanan. Tolong beri saya contoh teoretis dan bukan tautan ke "cara menggunakan" atau bentuk apa pun lainnya untuk metter itu. Saya tidak meminta Anda untuk "bekerja" untuk saya sementara saya tidak melakukan apa-apa hanya karena saya sudah melihat semua suka itu dan masih tidak yakin.
roiberg

5
itu perbedaan yang cukup penting. misalnya, jika Anda menggunakan layanan untuk menjaga koneksi tetap dengan server, Anda tidak dapat menggunakan layanan intentservice karena itu diakhiri tepat setelah ia menyelesaikan semua tugasnya
pelotasplus

24
ketika saya google itu, itu membawa saya ke sini. sekarang saya berada di loop tak terbatas.
Lou Morda

12

IntentService

IntentServiceberjalan di utasnya sendiri. Ini akan berhenti dengan sendirinya saat selesai. Lebih seperti api dan lupakan. Panggilan selanjutnya akan diantrikan. Bagus untuk mengantri panggilan. Anda juga dapat memutar beberapa utas di dalam IntentServicejika perlu - Anda dapat menggunakan ini ThreadPoolExecutor. Saya mengatakan ini karena banyak orang bertanya kepada saya "mengapa digunakan IntentServicekarena tidak mendukung eksekusi paralel". IntentServicehanyalah sebuah utas. Anda dapat melakukan apa pun yang Anda butuhkan di dalamnya - Bahkan memutar banyak utas. Satu-satunya peringatan adalah bahwa IntentServiceselesai segera setelah Anda memutar beberapa utas itu. Itu tidak menunggu utas-utas itu kembali. Anda harus mengurus ini. Jadi saya sarankan menggunakan ThreadPoolExecutordalam skenario itu.

  • Baik untuk Menyinkronkan, mengunggah dll ...

Layanan

Secara default Serviceberjalan di utas utama. Anda perlu memutar utas pekerja untuk melakukan pekerjaan Anda. Anda harus berhenti servicesecara eksplisit. Saya menggunakannya untuk situasi ketika Anda perlu menjalankan hal-hal di latar belakang bahkan ketika Anda menjauh dari aplikasi Anda dan kembali lagi untuk yang Tanpa Kepala service.

  • Sekali lagi Anda dapat menjalankan beberapa utas jika perlu.
  • Dapat digunakan untuk aplikasi seperti pemutar musik.

Anda selalu dapat berkomunikasi kembali ke aktivitas Anda menggunakan BroadcastReceiversjika perlu.


8

IntentService adalah perpanjangan Layanan yang dibuat untuk memudahkan pelaksanaan tugas yang perlu dieksekusi di latar belakang dan di utas terpisah.

IntentService dimulai, buat utas dan jalankan tugasnya di utas. Setelah selesai, itu membersihkan segalanya. Hanya satu instance dari IntentService yang dapat berjalan pada saat yang sama, beberapa panggilan enqueued.

Sangat mudah digunakan dan sangat nyaman untuk banyak penggunaan, misalnya mengunduh barang. Tetapi memiliki keterbatasan yang bisa membuat Anda ingin menggunakan Layanan yang lebih mendasar (tidak sederhana).

Misalnya, layanan yang terhubung ke server xmpp dan terikat oleh aktivitas tidak dapat dilakukan dengan menggunakan IntentService. Anda pada akhirnya akan mengabaikan atau mengganti barang IntentService.


apa yang tampaknya adalah bahwa kebanyakan orang yang ingin menjalankan layanan yang benar-benar berjalan lama di latar belakang akhirnya mencoba mencari tentang IntentService karena dokumen membuatnya tampak seperti itu untuk melakukan itu, Tapi Anda sebagian besar bisa saja menggunakan Thread baru (Runnable baru ()). mulai (). dengan kata lain, ketika ia berbicara tentang "menumbuhkan utas baru" hanya itu yang ia lakukan, itu tidak memindahkannya ke proses terpisah yang sebenarnya adalah apa yang kebanyakan orang lakukan ketika mereka ingin memisahkan beberapa kode yang sedang berjalan dari Activity ! (karena hanya memunculkan benang adalah kapal satu arah)
Lassi Kinnunen

intentService juga menangani siklus hidup utas, dan menggunakan looper, yang membantu penjadwal. Itu juga memastikan hanya satu instance berjalan, dan mengantri panggilan lain.
njzk2

5

Jika seseorang dapat menunjukkan kepada saya contoh dari sesuatu yang dapat Anda lakukan dengan IntentServicedan tidak dapat dilakukan dengan servicedan sebaliknya.

IntentService tidak dapat digunakan untuk Mendengarkan Waktu Lama, Seperti untuk Pendengar XMPP, ini adalah operator waktu tunggal, melakukan pekerjaan dan melambaikan tangan.

Itu juga hanya memiliki satu threadworker, tetapi dengan sebuah trik, Anda dapat menggunakannya sebagai tidak terbatas.


4

Perbedaan utama antara a Servicedan an IntentServicedijelaskan sebagai berikut:

Layanan:

1.A Servicesecara default, berjalan di utas utama aplikasi. (Di sini tidak ada utas pekerja default tersedia). Jadi pengguna perlu membuat utas terpisah dan melakukan pekerjaan yang diperlukan dalam utas itu.

2.Memungkinkan Banyak permintaan sekaligus. (Multi Threading)

IntentService:

1. Sekarang, datang ke IntentService, di sini utas pekerja default tersedia untuk melakukan operasi apa pun. Perhatikan bahwa - Anda perlu menerapkan onHandleIntent()metode, yang menerima maksud untuk setiap permintaan awal, di mana Anda dapat melakukan pekerjaan latar belakang.

2.Tapi hanya memungkinkan satu permintaan pada satu waktu.


3

Android IntentService vs Layanan

1. Layanan

  • Layanan dipanggil menggunakan startService ().
  • Layanan dapat dipanggil dari utas apa pun.
  • Layanan menjalankan operasi latar belakang pada Utas Utama Aplikasi secara default. Karena itu ia dapat memblokir UI Aplikasi Anda.
  • Layanan yang dipanggil beberapa kali akan membuat banyak instance.
  • Layanan harus dihentikan menggunakan stopSelf () atau stopService ().
  • Layanan Android dapat menjalankan operasi paralel.

2. IntentService

  • IntentService dipanggil menggunakan Intent.
  • IntentService dapat dipanggil dari utas utama saja.
  • IntentService membuat utas pekerja terpisah untuk menjalankan operasi latar belakang.
  • IntentService yang dipanggil beberapa kali tidak akan membuat banyak instance.
  • IntentService otomatis berhenti setelah antrian selesai. Tidak perlu memicu stopService () atau stopSelf ().
  • Dalam IntentService, beberapa panggilan maksud secara otomatis Diantri dan mereka akan dieksekusi secara berurutan.
  • IntentService tidak dapat menjalankan operasi paralel seperti Layanan.

Rujuk dari Sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.