Broadcast Receivers Untuk Pemula

Bagus Aji Santoso
4 min readOct 21, 2019

Diterjemahkan dari Broadcast Receivers For Beginners

Anggap kita punya sebuah aplikasi yang bergantung pada koneksi internet. Kita ingin agar aplikasi ini mendapatkan notifikasi ketika koneksi internet mengalami perubahan status. Bagaimana caranya? Salah satu solusi yang memungkinkan ialah dengan membuat sebuah service yang selalu memeriksa koneksi internet tersebut. Cara ini kurang disarankan karena beberapa alasan jadi akan kita skip saja.

Nah, solusi lainnya yaitu dengan menggunakan Broadcast Receiver karena kita tidak perlu selalu memeriksa, cukup menunggu informasi ketika perubahan itu terjadi. Sebuah Broadcast Receiver akan selalu mendapatkan notifikasi dari sebuah pesan broacast meskipun aplikasi sedang tidak dipakai.

Background

Broadcast receiver adalah komponen di aplikasi Android yang menunggu sebuah pesan broadcast (atau event yang terjadi) dari beberapa sumber:

  • Aplikasi itu sendiri
  • Dari sistem
  • Atau dari aplikasi lain

Sebuah broadcast sesungguhnya adalah pesan yang dibungkus menggunakan objek Intent. Broadcast bisa dibuat secara implicit atau explicit.

  • Sebuah implicit broadcast adalah pesan yang tidak hanya ditujukan pada aplikasi kita saja tapi siapapun. Untuk menerima pesan implicit ini, kita perlu menggunakan sebuah IntentFilter dan mendeklarasikannya di dalam manifest. Kita perlu melakukan langkah ini karena sistem operasi Android akan memberikan pesan broadcast pada setiap aplikasi yang sudah memiliki intent filter untuk pesan atau event tertentu. Karena cara kerjanya ini, implicit broadcast tidak menargetkan aplikasi tertentu. Contoh implicit intent misalnya adalah event saat ada SMS masuk.
  • Sebuah explicit broadcast adalah pesan yang ditujukan untuk aplikasi-aplikasi tertentu karena sudah menyiapkan suatu komponen. Hal ini terjadi karena ada atribut target yang menyebutkan package name atau nama kelas dari suatu aplikasi.

Ada dua cara untuk membuat receiver:

  1. Dengan mendeklarasikannya di AndroidManifest.xml di dalam tag <receiver>

Perhatikan bahwa broadcast receiver yang di deklarasikan di atas memiliki properti exported=”true”. Atribut ini memberitahu receiver bahwa ia bisa menerima broadcast di luar aplikasi yang dikembangkan ini.

2. Atau dengan mendaftarkan receiver ini lewat Java/Kotlin melalui registerReceiver

Implementasi

Untuk membuat broadcast receiver sendiri, kita mesti meng-extends parent class BroadcastReceiver dan meng-override method onReceive:

Hasilnya menjadi:

⚠️Method onReceive berjalan di main thread, oleh karena itu prosesnya tidak boleh lama.

Jika proses di dalam onReceive berlangsung lama, maka sistem bisa saja meng-kill proses setelah method ini selesai dieksekusi. Untuk mengatasinya silahkan pakai goAsync atau jadwalkan pekerjaan baru.

Contoh Registrasi Broadcast Receiver Secara Dinamis

Untuk mendaftarkan sebuah receiver dengan sebuah context, kamu harus terlebih dahulu membuat instance dari kelas broadcast receiver:

Lalu kita bisa memanggil method registerReceiver() pada objek Context.

Jangan lupa untuk memanggil method unregister di method onStop:

Mengirimkan Pesan Broadcasting

Tujuan pembuatan pesan broadcast dari dalam aplikasi yaitu untuk memungkinkan aplikasi tersebut bereaksi terhadap suatu event yang terjadi di dalamnya. Coba pikirkan suatu skenario di salah satu bagian kode kita ketika user melakukan suatu aksi, dan kita ingin melakukan suatu proses setelah aksi tersebut terjadi.

Atau tiga cara untuk mengirimkan broadcast:

  1. Dengan method sendOrderedBroadcast, kita bisa memastikan pesan broadcast untuk dikirimkan hanya pada satu receiver. Setiap broadcast secara bergantian bisa mengirimkan data ke broadcast sesudahnya atau menyelesaikan prosesnya di kelas receiver yang menerima.
  2. Method sendBroadcast mirip dengan method di atas, tapi dengan satu perbedaan. Semua broadcast receiver akan menerima pesan broadcast dan tidak bergantung pada broadcast lain.
  3. Method LocalBroadcastManager.sendBroadcast hanya akan mengirimkan pesan broadcast ke receiver yang terdapat di dalam aplikasi yang sama dan tidak mengumumkannya ke aplikasi lain.

Hal-hal yang perlu di perhatikan

  • Jangan mengirimkan data sensitif melalui implicit broadcast karena aplikasi apapun yang menunggu data tersebut bisa menerimanya. Kita bisa mencegah hal ini dengan menentukan package name atau memberikan sebuah permission ke pesan broadcast.
  • Jangan memulai activity dari sebuah broadcast yang diterima. Tampilkan saja pesan notifikasi

Poin-poin berikut adalah beberapa perubahan pada sistem broadcast receiver yang relevan. Untuk setiap versi beberapa limitasi diberikan dan perilakunya juga berubah. Reviu kembali limitasi ini saat akan membuat sebuah broadcast receiver.

  • 7.0 ke atas (API level 24) —Dua broadcast yang berasal dari sistem ditiadakan yaitu Action_New_Picture dan Action_New_Video (tapi bisa kembali lagi di Android O dengan pendaftaran receiver lewat Java/Kotlin)
  • 8.0 ke atas (API level 26) — Sebagian besar implicit broadcast perlu diregistrasikan secara dinamis (bukan melalui manifest). Kamu bisa memeriksa daftar broadcast tersebut di link ini.
  • 9.0 ke atas (API level 28) —Informasi yang diterima dari broadcast Wi-FI dari sistem dikurangi dan adanya action bernama Network_State_Changed_Action.

Perubahan di Android O adalah perubahan yang paling penting untuk diketahui. Perubahan ini dibuat untuk mengatasi masalah performa perangkat, konsumsi baterai yang boros sehingga bisa mengganggu experience pengguna. Masalah tersebut terjadi karena banyak aplikasi (bahkan yang sedang tidak aktif) menunggu event yang terjadi di sistem sehingga ketika terjadi perubahan, sistem akan memakan sumber daya yang besar untuk mengirimkannya. Bayangkan setiap aplikasi yang menunggu suatu event tiba-tiba langsung aktif untuk melakukan sesuatu dalam rangka merespon broadcast yang diterima. Apalagi jika yang ditunggu adalah perubahan seperti status koneksi Wi-Fi yang amat sering terjadi.

Alternatif Broadcast Receivers

Berikut ini alternatif-alternatif yang bisa dipakai selain broadcast receiver. Setiap alternatif memiliki kemampuan yang berbeda-beda:

  • LocalBroadcastManager —Dapat dipakai untuk mengirim pesan broadcast untuk komponen yang ada di dalam aplikasi yang sama.
  • Scheduling A Job — Sebuah job bisa dijalankan pada saat tertentu sesuai kondisi tertentu yang bisa diatur. JobScheduler juga memberikan garansi bahwa tugas tersebut pasti akan diproses.

--

--