Pada artikel ini, kita akan membahas tentang satu masalah dengan JobIntentService, tentang yang mana ada banyak pertanyaan tentang sumber daya yang sesuai dan laporan dalam pelacak bug Google. Dan juga tentang alasan mengapa, dilihat dari segalanya, Google tidak menganggapnya sebagai bug dan menutup laporan ini.
Pendahuluan
JobIntentServices dibuat untuk pekerjaan latar belakang. Mereka banyak digunakan di Android 8 dan di atas, ketika kemampuan untuk menggunakan layanan di latar belakang menghilang.
Bahkan, mereka mengganti layanan di latar belakang, dan juga di bawah kendali penjadwal tugas (JobScheduler).
Dengan demikian, sistem memiliki kemampuan untuk mengontrol kemajuan tugas di latar belakang dan juga mengontrol wakelocks itu sendiri, yang memungkinkan untuk mengoptimalkan konsumsi baterai perangkat dan untuk menghindari kesalahan penggunaan wakelocks oleh pengembang. Langkah-langkah ini telah meminimalkan situasi ketika perangkat tidak dapat terjun ke mode tidur (Mode Tidur), yang lagi-lagi mempengaruhi penghematan baterai.
Secara singkat tentang JobIntentService
Intinya, JobIntentService adalah IntentService yang sama di bawah kendali penjadwal tugas (JobScheduler).
Berjalan di utas latar belakang AsyncTask.
Dalam versi Android 4.4 dan di bawahnya, IntentService biasa digunakan.
Penjelasan terperinci dapat ditemukan dalam dokumentasi.
Siklus Hidup dan Perangkap
Kedua jenis tugas memiliki siklus hidup yang sama. Tugas dikontrol oleh Handler dan memiliki status.
Meskipun keadaan ini tidak dapat diakses secara eksternal, dalam keadaan tertentu sistem melempar pengecualian di mana aplikasi crash. Perilaku ini merupakan masalah dan sakit kepala bagi banyak pengembang dan sayangnya tidak memiliki solusi sederhana. Untuk mulai dengan, kami mempelajari status dan siklus hidup tugas, dan kemudian mempertimbangkan solusi yang mungkin.
Urutan Status Tugas

BINDING - batas waktu pembuatan tugas (ikatan layanan) 18 detik.
MULAI - status peluncuran tugas, batas waktu 8 detik.
EXECUTING - status pelaksanaan tugas, batas waktu 10 menit.
STOPPING - status berhenti tugas (misalnya, setelah panggilan batal ()), batas waktu 8 detik.
SELESAI - keadaan akhir dari tugas yang diselesaikan, keadaan terakhir dalam siklus hidup tugas.
Diagram siklus hidup tugas yang disederhanakan

Setiap negara tugas memiliki batas waktu sendiri. Setelah batas waktu, tugas terputus terlepas dari statusnya. Sebenarnya, ini adalah mekanisme time-out dan merupakan perangkap sejak itu setelah batas waktu sistem melempar pengecualian dari tipe java.lang.SecurityException
dan aplikasi lumpuh dengan pesan berikut Caller no longer running, last stopped +1s600ms because: timed out while starting
mana +1s600ms
adalah waktu yang telah berlalu sejak batas waktu habis saat pengecualian dilemparkan, dan "alasan" ( because: timed out while starting
) menunjukkan status tugas saat batas waktu berakhir.
Kesimpulan
Seperti yang ditunjukkan oleh pengalaman, pengecualian ini ditemukan dalam aplikasi yang cukup dimuat.
Untuk mendukung masalah ini, orang dapat mengamati baik pada perangkat lemah dan di atas. Masalah ini juga ditunjukkan oleh pengecualian yang dilemparkan dengan pesan batas waktu. Dengan demikian, keputusan tentang membongkar aplikasi dan mengoptimalkan penggunaan JobIntentServices, misalnya, untuk menghindari situasi ketika beberapa JobIntentServices diluncurkan secara paralel, menunjukkan sendiri. Solusi kedua, dalam beberapa kasus lebih sepele, dan kadang-kadang lebih rumit daripada opsi pertama, adalah menggunakan JobService.
Selain itu, jika Anda mencari masalah ini di Google, Anda dapat menemukan opsi "meragukan" lainnya untuk menyelesaikan masalah ini, misalnya, Anda dapat melihat tautan berikut:
Opsi 1
Opsi 2
Opsi 3
PS
Saat ini, Google sedang mempersiapkan pengganti yang baik untuk JobService dan JobIntentService - ini adalah Worker dan WorkManger dari paket androidx.work.
Sayangnya, alat-alat ini belum siap untuk diproduksi dan memiliki sejumlah bug, tetapi sudah sekarang, seperti yang ditunjukkan oleh tes, mereka memecahkan masalah yang dijelaskan di atas.