Android onCreate atau onStartCommand untuk memulai layanan

105

Biasanya ketika saya membuat layanan Android saya menerapkan onCreatemetode ini, tetapi dalam proyek terakhir saya ini tidak berhasil. Saya mencoba menerapkan onStartCommand, dan ini tampaknya berhasil.

Pertanyaannya adalah: ketika saya harus menerapkan layanan metode mana yang diperlukan? Metode apa yang harus saya terapkan? onCreate,, onStartCommandatau keduanya? Dan apa peran masing-masing?

GVillani82
sumber
onCreateselalu dipanggil terlepas
IgorGanapolsky

Jawaban:

189

onCreate()dipanggil saat Serviceobjek dibuat instance-nya (yaitu: saat layanan dibuat ). Anda harus melakukan hal-hal dalam metode ini yang perlu Anda lakukan hanya sekali (yaitu: menginisialisasi beberapa variabel, dll.). onCreate()hanya akan dipanggil sekali per objek yang dibuat instance-nya .

Anda hanya perlu menerapkan onCreate()jika Anda benar-benar ingin / perlu menginisialisasi sesuatu hanya sekali .

onStartCommand()dipanggil setiap kali klien memulai layanan menggunakan startService(Intent intent). Ini berarti onStartCommand()dapat dipanggil beberapa kali. Anda harus melakukan hal-hal dalam metode ini yang diperlukan setiap kali klien meminta sesuatu dari layanan Anda. Ini sangat tergantung pada apa yang dilakukan layanan Anda dan bagaimana layanan itu berkomunikasi dengan klien (dan sebaliknya).

Jika Anda tidak menerapkannya, onStartCommand()Anda tidak akan bisa mendapatkan informasi apa pun dari Intentyang diteruskan oleh klien onStartCommand()dan layanan Anda mungkin tidak dapat melakukan pekerjaan yang berguna.

David Wasser
sumber
6
Bisakah dua contoh dari Layanan yang sama ada dalam sebuah aplikasi?
jacktrades
1
@jacktrades Secara teoritis dan menurut dokumentasinya: Tidak. Namun, tampaknya ada beberapa bug di Android di mana memang dalam keadaan tertentu itu akan membuat beberapa contoh Layanan. Namun, seperti yang saya katakan, ini adalah bug, dan kami tidak dapat mereproduksinya sesuka hati. Kenapa kamu bertanya?
David Wasser
3
@Mr_and_Mrs_D Sejauh yang saya tahu, tidak ada bug resmi yang dilaporkan. Namun, ada beberapa laporan tentang hal ini terjadi dan saya memiliki aplikasi yang saya tahu bahwa hal itu sedang terjadi. Saya tidak dapat mengurangi masalah menjadi sesuatu yang kecil dan berulang, jadi saya sendiri tidak melaporkan bug. Dokumentasi tidak secara eksplisit menyatakan bahwa layanan adalah lajang, tetapi sangat jelas bahwa itulah yang dimaksudkan. Lihat dokumen untuk 'startService () `: dengan jelas menyatakan bahwa jika layanan belum berjalan, itu akan dibuat dan dimulai, jika sedang berjalan tetap berjalan
David Wasser
6
@Diffy Saat Anda memanggil startService(), jika layanan tidak berjalan, Android akan membuat instance kelas layanan (ini adalah objek layanan) dan kemudian akan memanggil onCreate()objek tersebut. Itu kemudian akan memanggil onStartCommand()objek itu. Jika, suatu saat nanti, Anda memanggil lagi startService(), jika layanan masih berjalan, Android tidak akan membuat objek layanan baru. Sebaliknya, itu hanya akan memanggil onStartCommand()objek layanan yang ada. Apakah itu jelas?
David Wasser
1
Aku cinta kamu! (y) bekerja seperti sulap (y) penjelasan yang sangat sederhana dan bagus
Hilton Khadka
11

Layanan berperilaku sama seperti Aktivitas Apa pun yang Anda inginkan associatesekali dengan layanan akan masuk onCreateseperti inisialisasi

dan kapan pun servicedipanggil menggunakan startService .onStartCommandakan dipanggil. dan Anda dapat melakukan tindakan apa pun. seperti untuk pemutar musik, Anda dapat memutar, menjeda, berhenti menggunakan tindakan

Dan Anda melakukan apa pun operation in servicedengan mengirimkan tindakan dan menerimanya dionStartCommand

onCreate bekerja seperti seorang Pembuat.

Edit Singkat

onCreate()panggilan hanya untuk pertama kali Anda memulai ServiceSedangkan onStartCommand()panggilan setiap kali Anda menelepon startServicelagi. Ini memungkinkan Anda mengatur tindakan seperti putar, hentikan, jeda musik.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}
AndroidGeek
sumber
Jadi, ketika saya memanggil layanan menggunakan startService (maksud), apakah onCreate () tidak akan dipanggil? Saya ragu memahami apa itu 'objek layanan' karena saya selalu memulai layanan dengan startSevice (maksud).
Diffy
sudahkah Anda membuat instance objek layanan dengan benar atau Mungkin Anda tidak memiliki layanan dalam manifes Anda
AndroidGeek
memulai layanan seperti startService (new Intent (this, ServiceName.class));
AndroidGeek
Tetapi apakah metode ini disebut memberi contoh layanan? Di manakah objek layanan itu?
Berbeda
Ini adalah cara memanggil Aktivitas dan Layanan menggunakan maksud yang bertanggung jawab untuk membuka Aktivitas dan Layanan di Android. Apa yang ingin Anda lakukan dengan objek layanan, Anda juga bisa melakukannya dengan niat. Maksud saya meneruskan data ke Layanan
AndroidGeek