Perbandingan Layanan kelas dasar, dalam proses, dasar ✱ dengan AsyncTask:
✱ (Jawaban ini tidak membahas layanan yang diekspor, atau layanan apa pun yang berjalan dalam proses yang berbeda dari klien, karena kasus penggunaan yang diharapkan berbeda secara substansial dengan yang ada pada AsyncTask. Juga, untuk kepentingan singkatnya, sifat khusus tertentu Servicesubclass (mis. IntentService, JobService) akan diabaikan di sini.)
Proses Seumur Hidup
A Servicemewakili, untuk OS, "keinginan aplikasi untuk melakukan operasi yang berjalan lebih lama sementara tidak berinteraksi dengan pengguna" [ ref ].
Saat Anda Servicemenjalankan, Android memahami bahwa Anda tidak ingin proses Anda terbunuh. Ini juga benar setiap kali Anda memiliki Activitylayar, dan itu terutama berlaku ketika Anda menjalankan layanan latar depan . (Ketika semua komponen aplikasi Anda hilang, Android berpikir, "Oh, sekarang adalah waktu yang tepat untuk mematikan aplikasi ini, jadi saya dapat membebaskan sumber daya".)
Juga, tergantung pada nilai pengembalian terakhir dari Service.onCreate(), Android dapat mencoba untuk "menghidupkan kembali" aplikasi / layanan yang terbunuh karena tekanan sumber daya [ ref ].
AsyncTasksjangan lakukan itu. Tidak peduli berapa banyak utas latar yang Anda jalankan, atau seberapa keras mereka bekerja: Android tidak akan membuat aplikasi Anda tetap hidup hanya karena aplikasi Anda menggunakan CPU. Itu harus memiliki beberapa cara untuk mengetahui bahwa aplikasi Anda masih memiliki pekerjaan yang harus dilakukan; itu sebabnya Servicesterdaftar di OS, dan AsyncTaskstidak.
Multithreading
AsyncTasks semua tentang membuat utas latar untuk melakukan pekerjaan, dan kemudian mempresentasikan hasil pekerjaan itu ke utas UI dengan cara yang aman.
Setiap AsyncTaskeksekusi baru umumnya menghasilkan lebih banyak konkurensi (lebih banyak utas), tergantung pada batasan dari AsyncTasks'skumpulan utas [ ref ].
Servicemetode, di sisi lain, selalu dipanggil pada utas UI [ ref ]. Hal ini berlaku untuk onCreate(), onStartCommand(), onDestroy(), onServiceConnected(), dll Jadi, dalam arti, Servicestidak "lari" di latar belakang. Begitu mereka mulai ( onCreate()), mereka hanya "duduk" di sana - sampai tiba waktunya untuk membersihkan, mengeksekusi onStartCommand(), dll.
Dengan kata lain, menambahkan tambahan Servicestidak menghasilkan lebih banyak konkurensi. Metode layanan bukan tempat yang baik untuk melakukan banyak pekerjaan, karena mereka berjalan di utas UI .
Tentu saja, Anda dapat memperluas Service, menambahkan metode Anda sendiri, dan memanggil mereka dari utas yang Anda inginkan. Tetapi jika Anda melakukan itu, tanggung jawab untuk keselamatan benang ada pada Anda - bukan kerangka kerjanya.
Jika Anda ingin menambahkan utas latar (atau semacam pekerja lain) ke Anda Service, Anda bebas untuk melakukannya. Anda bisa memulai thread latar belakang / AsyncTaskdi Service.onCreate(), misalnya. Tetapi tidak semua kasus penggunaan memerlukan ini. Sebagai contoh:
- Anda mungkin ingin terus
Servicemenjalankannya sehingga Anda dapat terus mendapatkan pembaruan lokasi di "latar belakang" (artinya, tanpa harus memiliki Activitieslayar).
- Atau, Anda mungkin ingin menjaga aplikasi tetap hidup hanya agar Anda dapat "
BroadcastReceiverterdaftar " secara jangka panjang (setelah API 26, Anda tidak selalu dapat melakukan ini melalui manifes, jadi Anda harus mendaftar saat runtime sebagai gantinya [ ref ]).
Tak satu pun dari kasus penggunaan ini membutuhkan banyak aktivitas CPU; mereka hanya meminta agar aplikasi tidak terbunuh .
Sebagai Pekerja
Servicestidak berorientasi pada tugas. Mereka tidak diatur untuk "melakukan tugas" dan "memberikan hasil", seperti AsyncTasksjuga. Servicesjangan menyelesaikan masalah keamanan thread (terlepas dari kenyataan bahwa semua metode dijalankan pada satu thread). AsyncTasks, di sisi lain, atasi kompleksitas itu untuk Anda.
Perhatikan bahwa AsyncTaskini dijadwalkan untuk bantahan . Tetapi itu tidak berarti Anda harus mengganti AsyncTasksdengan Anda Services! (Jika Anda telah belajar sesuatu dari jawaban ini, itu harus jelas.)
TL; DR
Servicessebagian besar ada di sana untuk "ada". Mereka seperti di luar layar Activity, memberikan alasan bagi aplikasi untuk tetap hidup, sementara komponen lain mengurus melakukan "pekerjaan". AsyncTasksmelakukan "pekerjaan", tetapi mereka tidak akan, dalam dan dari diri mereka sendiri, menjaga proses tetap hidup.