The Android Developer Challenge is back! Submit your idea before December 2.

Batas Eksekusi Latar Belakang

Bila dijalankan di latar belakang, aplikasi akan menggunakan sumber daya perangkat yang terbatas, seperti RAM. Hal ini bisa merusak pengalaman pengguna, terutama jika pengguna sedang menggunakan aplikasi yang banyak menggunakan sumber daya, seperti memainkan game atau menonton video. Untuk memperbaiki pengalaman pengguna, Android 8.0 (API level 26) mengenakan batasan atas apa yang bisa dilakukan aplikasi saat dijalankan di latar belakang. Dokumen ini menjelaskan perubahan pada sistem operasi, dan cara mengupdate aplikasi Anda agar bekerja dengan baik dengan batasan baru.

Ringkasan

Banyak aplikasi dan layanan Android yang bisa dijalankan secara bersamaan. Misalnya, seorang pengguna bisa memainkan game di satu jendela sambil menjelajahi web di jendela yang lain, dan menggunakan aplikasi pihak ketiga untuk memainkan musik. Semakin banyak aplikasi yang dijalankan secara bersamaan, semakin besar beban yang diberikan pada sistem. Jika layanan atau aplikasi tambahan dijalankan di latar belakang, hal ini akan memberikan beban tambahan pada sistem, yang bisa mengakibatkan pengalaman pengguna yang buruk; misalnya, aplikasi musik tiba-tiba ditutup.

Untuk menurunkan kemungkinan terjadinya masalah ini, Android 8.0 menerapkan batasan atas apa yang bisa dilakukan oleh sistem selagi pengguna tidak berinteraksi secara langsung dengan aplikasi. Aplikasi dibatasi dengan dua cara:

  • Batasan Layanan Latar Belakang: Selagi aplikasi diam, ada batas pada penggunaan layanan latar belakangnya. Hal ini tidak berlaku pada layanan latar depan, yang lebih terlihat oleh pengguna.

  • Batasan Siaran: Dengan pengecualian terbatas, aplikasi tidak bisa menggunakan manifesnya untuk mendaftar siaran implisit. Aplikasi tetap bisa mendaftar ke siaran ini pada waktu proses, dan bisa menggunakan manifes untuk mendaftar ke siaran eksplisit yang secara spesifik ditargetkan pada aplikasi mereka.

Umumnya, aplikasi bisa menangani batasan ini dengan menggunakan tugas JobScheduler. Pendekatan ini memungkinkan aplikasi bersiap menjalankan pekerjaan bila aplikasi tidak sedang dijalankan secara aktif, namun tetap memberi kesempatan pada sistem untuk menjadwalkan semua tugas ini dengan cara yang tidak memengaruhi pengalaman pengguna. Android 8.0 menawarkan sejumlah peningkatan pada JobScheduler yang membuatnya jadi lebih mudah mengganti layanan dan penerima siaran dengan tugas terjadwal; untuk informasi selengkapnya, lihat Peningkatan JobScheduler.

Batasan Layanan Latar Belakang

Layanan yang dijalankan di latar belakang bisa menghabiskan sumber daya perangkat, yang mungkin saja mengakibatkan pengalaman pengguna yang buruk. Untuk meringankan masalah ini, sistem menerapkan sejumlah batasan atas layanan.

Sistem membedakan antara aplikasi latar depan dan latar belakang. (Definisi latar belakang untuk keperluan batasan layanan berbeda dengan definisi yang digunakan oleh manajemen memori; suatu aplikasi mungkin berada di latar belakang sehubungan dengan manajemen memori, namun berada di latar depan sehubungan dengan kemampuannya meluncurkan layanan.) Aplikasi dianggap berada di latar depan jika berlaku salah satu dari hal berikut ini:

  • Aplikasi memiliki aktivitas yang terlihat, baik yang telah dimulai maupun yang dihentikan sementara.
  • Aplikasi memiliki layanan latar depan.
  • Aplikasi latar depan yang lain terhubung ke aplikasi tersebut, baik melalui pengikatan ke salah satu layanannya maupun melalui penggunaan salah satu penyedia kontenya. Misalnya, aplikasi berada di latar depan jika aplikasi lain mengikatnya:
    • IME
    • Layanan wallpaper
    • Listener notifikasi
    • Layanan teks atau suara

Jika tidak satu pun dari ketentuan ini yang berlaku, aplikasi akan dianggap berada di latar belakang.

Catatan: Aturan ini sama sekali tidak memengaruhi layanan terikat. Jika aplikasi Anda mendefinisikanlayanan terikat, komponen lain bisa mengikat ke layanan itu, baik aplikasi Anda berada di latar depan maupun tidak.

Saat berada di latar depan, aplikasi bisa membuat dan menjalankan layanan latar belakang dan latar depan secara leluasa. Bila beralih ke latar belakang, aplikasi memiliki jangka waktu beberapa menit yang tetap mengizinkannya untuk membuat dan menggunakan layanan. Di akhir jangka waktu itu, aplikasi akan dianggap diam. Pada waktu ini, sistem akan menghentikan layanan latar belakang aplikasi, seakan-akan aplikasi telah memanggil metode Service.stopSelf() layanan.

Dalam keadaan tertentu, aplikasi latar belakang dimasukkan dalam daftar yang diizinkan sementara selama beberapa menit. Walaupun berada dalam daftar yang diizinkan, aplikasi bisa meluncurkan layanan tanpa batasan, dan layanan latar belakangnya boleh dijalankan. Aplikasi dimasukkan dalam daftar yang diizinkan bila menangani suatu tugas yang terlihat oleh pengguna, misalnya:

Catatan: IntentService adalah sebuah layanan, dan oleh karenanya tunduk pada pembatasan baru pada layanan latar belakang. Sebagai hasilnya, banyak aplikasi yang mengandalkan IntentService tidak berfungsi dengan baik saat menarget Android 8.0 atau lebih tinggi. Untuk alasan ini, Android Support Library 26.0.0 memperkenalkan kelas JobIntentService baru, yang menyediakan fungsionalitas yang sama dengan IntentService tetapi menggunakan tugas alih-alih layanan saat dijalankan di Android 8.0 atau lebih tinggi.

Umumnya, aplikasi Anda bisa mengganti layanan latar belakang dengan tugas JobScheduler. Misalnya, CoolPhotoApp perlu memeriksa apakah pengguna telah menerima foto yang dibagikan dari teman, sekalipun aplikasi tidak sedang berjalan di latar depan. Sebelumnya, aplikasi telah menggunakan layanan latar belakang yang telah diperiksa dengan penyimpanan cloud milik aplikasi. Untuk bermigrasi ke Android 8.0 (API level 26), developer mengganti layanan latar belakang dengan tugas terjadwal, yang diluncurkan secara berkala, membuat kueri ke server, kemudian keluar.

Sebelum Android 8.0, biasanya cara membuat layanan latar depan adalah membuat layanan latar belakang, kemudian mempromosikan layanan itu ke latar depan. Dengan Android 8.0, terjadi suatu detail; sistem tidak mengizinkan aplikasi latar belakang untuk membuat layanan latar belakang. Karena alasan ini, Android 8.0 memperkenalkan metode baru startForegroundService() untuk memulai layanan baru di latar depan. Setelah sistem membuat layanan, aplikasi memiliki waktu lima detik untuk memanggil metode startForeground() layanan tersebut guna menampilkan notifikasi yang terlihat oleh pengguna layanan itu. Jika aplikasi tidak memanggil startForeground() dalam batas waktu itu, sistem akan menghentikan layanan dan mendeklarasikan aplikasi sebagai ANR.

Batasan Siaran

Jika suatu aplikasi mendaftar untuk menerima siaran, penerima aplikasi akan menggunakan sumber daya setiap kali siaran dikirim. Hal ini bisa menyebabkan masalah jika terlalu banyak aplikasi yang mendaftar untuk menerima siaran berdasarkan kejadian sistem; kejadian sistem yang memicu siaran bisa menyebabkan semua aplikasi itu menggunakan sumber daya dalam rentetan cepat, sehingga merusak pengalaman pengguna. Untuk meringankan masalah ini, Android 7.0 (API level 24) menerapkan batasan atas siaran, seperti yang dijelaskan dalam Optimalisasi Latar Belakang. Android 8.0 (API level 26) membuat pembatasan-pembatasan ini lebih ketat.

  • Aplikasi yang menargetkan Android 8.0 tidak bisa lagi mendaftarkan penerima siaran untuk mendapatkan siaran implisit dalam manifesnya. Siaran implisit adalah siaran yang tidak menargetkan aplikasi itu secara spesifik. Misalnya, ACTION_PACKAGE_REPLACED adalah siaran implisit, karena dikirim ke semua listener yang telah didaftarkan, sehingga memungkinkannya untuk mengetahui apakah beberapa paket di perangkat telah diganti. Akan tetapi, ACTION_MY_PACKAGE_REPLACED bukan siaran implisit, karena dikirim hanya ke aplikasi yang paketnya telah diganti, berapa pun banyaknya aplikasi lain yang telah mendaftarkan listener untuk siaran itu.
  • Aplikasi tetap bisa mendaftar untuk mendapatkan siaran eksplisit dalam manifesnya.
  • Aplikasi bisa menggunakan Context.registerReceiver() pada waktu proses untuk mendaftarkan penerima suatu siaran, baik implisit maupun eksplisit.
  • Siaran yang memerlukan izin tanda tangan dikecualikan dari pembatasan ini, karena siaran ini hanya dikirim ke aplikasi yang ditandatangani dengan sertifikat yang sama, tidak ke semua aplikasi pada perangkat.

Umumnya, aplikasi yang sebelumnya telah mendaftar siaran implisit bisa mendapatkan fungsionalitas serupa dengan menggunakan tugas JobScheduler. Misalnya, aplikasi foto sosial perlu melakukan pembersihan pada datanya dari waktu ke waktu, dan lebih suka melakukannya saat perangkat terhubung ke pengisi daya. Sebelumnya, aplikasi yang telah mendaftarkan penerima ACTION_POWER_CONNECTED dalam manifesnya; bila aplikasi menerima siaran itu, aplikasi akan memeriksa apakah perlu melakukan pembersihan. Untuk bermigrasi ke Android 8.0 atau lebih tinggi, aplikasi menghapus penerima itu dari manifesnya. Sebagai gantinya, aplikasi akan menjadwalkan tugas pembersihan yang dijalankan bila perangkat sedang diam dan mengisi daya.

Panduan Migrasi

Secara default, perubahan-perubahan ini hanya berdampak pada aplikasi yang menarget Android 8.0 (API level 26) atau lebih tinggi. Namun demikian, pengguna bisa mengaktifkan pembatasan ini untuk aplikasi dari layar Pengaturan, meskipun aplikasinya menarget level API yang lebih rendah dari 26. Anda mungkin perlu mengupdate aplikasi untuk mematuhi batasan baru ini.

Periksa untuk mengetahui cara aplikasi Anda menggunakan layanan. Jika aplikasi Anda mengandalkan layanan yang berjalan di latar belakang saat diam, maka Anda perlu menggantinya. Solusi yang memungkinkan antara lain:

  • Jika aplikasi Anda perlu membuat layanan latar depan selagi aplikasi berada di latar belakang, gunakan metode startForegroundService() alih-alih startService().
  • Jika layanan terlihat oleh pengguna, maka jadikan layanan latar depan. Misalnya, layanan yang memainkan audio harus selalu berupa layanan latar depan. Buat layanan dengan startForegroundService() alih-alih startService().
  • Temukan cara untuk menduplikasi fungsionalitas layanan dengan tugas terjadwal. Jika layanan tidak melakukan sesuatu yang langsung terlihat oleh pengguna, Anda biasanya dapat menggunakan tugas terjadwal sebagai gantinya.
  • Gunakan FCM untuk membangunkan aplikasi Anda secara selektif bila muncul kejadian jaringan, bukan menjajaki di latar belakang.
  • Tangguhkan pekerjaan latar belakang hingga aplikasi berada di latar depan dengan sendirinya.

Tinjau penerima siaran yang didefinisikan dalam manifes aplikasi Anda. Jika manifes Anda mendeklarasikan penerima siaran implisit, Anda harus menggantinya. Solusi yang memungkinkan antara lain:

  • Buat penerima pada waktu proses dengan memanggil Context.registerReceiver(), sebagai ganti mendeklarasikan penerima dalam manifes.
  • Gunakan tugas terjadwal untuk memeriksa ketentuan yang akan memicu siaran implisit.