Jika saya memiliki kode berikut:
Intent intent = new Intent(this,DownloadService.class);
for(int i=0;i<filesArray.length;i++){
startService(intent);
}
Dalam kode ini DownloadService
meluas IntentService
.
Jadi sekarang ketika saya menelepon startService(intent)
apakah itu berarti saya memulai layanan baru setiap kali startService(intent)
dipanggil atau apakah itu berarti DownloadService
dijalankan sekali dan kemudian setiap kali saya memanggilnya startService(intent)
hanya akan meneruskan maksud yang berbeda dengan startId yang berbeda.
Apakah ini masuk akal, dan yang mana yang merupakan masalahnya?
onCreate()
jika layanan sudah dibuat). Seharusnya mudah untuk menentukan apakah Anda meletakkan aLog.i()
di kedua callback dan memeriksa LogCat.startService()
asynchronous. Jadi saat Anda mengulang panggilan, layanan itu sendiri belum mendapatkan sumber daya apa pun dan belum dimulai.Tepat sekali. Hanya satu contoh Layanan yang dibuat untuk proses aplikasi. Dan ketika Anda memanggil
StartService();
lagi, maka hanyaonStartCommand()
dipanggil dan Intent baru diteruskan keonStartCommand()
metode.Catatan:
onCreate()
tidak dipanggil lagi.Tentang menelepon
bindService()
beberapa kali:Jika Anda memanggil
bindService()
beberapa kali, hanya satu instance yang digunakan untuk Layanan dan Android Runtime mengembalikan objek IBinder yang sama ke klien.Artinya,
onBind()
tidak dipanggil berkali-kali. Dan objek IBinder yang baru saja di-cache dikembalikan.sumber
onStop()
harus dipanggil untuk setiap korespondensionStartCommand
?Menambahkan beberapa informasi lagi ke jawaban di atas yang mungkin berguna bagi orang lain adalah,
startId
bahwaonStartCommand()
metode yang diterima berbeda untuk setiapstartService()
panggilan.Juga jika kita menulis untuk loop seperti yang disebutkan di atas, kode yang ditulis
onHandleIntent()
akan dieksekusi berkali-kali seperti yang didefinisikan oleh frekuensi loop for, tetapi secara berurutan dan tidak secara paralel.Konsepnya adalah
IntentService
membuat antrean kerja dan setiap permintaan kestartService()
pemicuonStartCommand()
yang pada gilirannya menyimpan maksud dalam antrean kerja dan kemudian meneruskan maksud satu per satu keonHandleIntent()
.sumber
Menurut dok :
dan
sumber