Waktu tunggu layanan latar depan

Jika aplikasi menargetkan Android 15 atau yang lebih tinggi, sistem akan membatasi durasi layanan latar depan tertentu diizinkan berjalan saat aplikasi Anda berada di latar belakang. Saat ini, pembatasan ini hanya berlaku untuk layanan latar depan jenis layanan latar depan dataSync dan mediaProcessing. Ada batas yang lebih ketat pada shortService latar depan jenis layanan yang dibahas dalam dokumentasi jenis layanan tersebut.

Perilaku waktu tunggu

Sistem mengizinkan layanan latar depan dataSync dan mediaProcessing berjalan selama total 6 jam dalam periode 24 jam, setelah itu sistem akan memanggil metode Service.onTimeout(int, int) layanan yang sedang berjalan (diperkenalkan di Android 15). (Jenis layanan latar depan mediaProcessing ditambahkan di Android 15.) Batas waktu enam jam dilacak secara terpisah untuk layanan dataSync dan mediaProcessing. Misalnya, jika layanan dataSync baru saja berjalan selama satu jam, aplikasi hanya akan memiliki lima jam yang tersedia untuk layanan latar depan dataSync, tetapi akan memiliki enam jam penuh yang tersedia untuk layanan mediaProcessing.

Saat layanan latar depan mencapai batas enam jam, layanan memiliki beberapa detik untuk memanggil Service.stopSelf(). Saat sistem memanggil Service.onTimeout(), layanan tidak lagi dianggap sebagai layanan latar depan. Jika layanan tidak memanggil Service.stopSelf(), sistem akan menampilkan pengecualian internal. Pengecualian dicatat di Logcat dengan pesan berikut:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

Untuk menghindari masalah dengan perubahan perilaku ini, Anda dapat melakukan satu atau beberapa hal berikut:

  1. Minta layanan Anda menerapkan metode Service.onTimeout(int, int) yang baru. Saat aplikasi Anda menerima callback, pastikan untuk memanggil stopSelf() dalam beberapa detik. (Jika Anda tidak segera menghentikan aplikasi, sistem akan menghasilkan kegagalan.)
  2. Pastikan layanan dataSync dan mediaProcessing aplikasi Anda tidak berjalan selama lebih dari total 6 jam dalam periode 24 jam (kecuali jika pengguna berinteraksi dengan aplikasi, sehingga mereset timer).
  3. Hanya mulai layanan latar depan dataSync atau mediaProcessing sebagai hasil dari interaksi langsung pengguna; karena aplikasi Anda berada di latar depan saat layanan dimulai, layanan Anda memiliki waktu enam jam penuh setelah aplikasi beralih ke latar belakang.
  4. Daripada menggunakan layanan latar depan ini, gunakan API alternatif, seperti WorkManager. Khususnya, alih-alih menggunakan layanan latar depan dataSync, pertimbangkan untuk menggunakan API alternatif.

Jika layanan latar depan dataSync aplikasi Anda telah berjalan selama 6 jam dalam 24 jam terakhir, Anda tidak dapat memulai layanan latar depan dataSync lainnya kecuali pengguna telah membawa aplikasi Anda ke latar depan (yang akan mereset timer). Jika Anda mencoba memulai layanan latar depan dataSync lain, sistem akan menampilkan ForegroundServiceStartNotAllowedException dengan pesan error seperti "Batas waktu telah habis untuk layanan latar depan jenis dataSync".

Pengujian

Untuk menguji perilaku aplikasi, Anda dapat mengaktifkan waktu tunggu sinkronisasi data meskipun aplikasi Anda tidak menargetkan Android 15 (selama aplikasi berjalan di perangkat Android 15). Untuk mengaktifkan waktu tunggu, jalankan perintah adb berikut:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

Anda juga dapat menyesuaikan periode waktu tunggu, untuk mempermudah pengujian perilaku aplikasi Anda saat batas tercapai. Untuk menetapkan periode waktu tunggu baru untuk layanan latar depan dataSync, jalankan perintah adb berikut:

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

Untuk menetapkan periode waktu tunggu baru untuk layanan latar depan mediaProcessing, jalankan perintah ini:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds