BroadcastReceiver adalah sebuah komponen aplikasi dalam Android seperti halnya seperti activity service, dan receiver lain. Sesuai dengan namanya, “broadcast receiver“, tujuan dari disediakannya komponen ini adalah untuk menerima “pesan” broadcast baik dari aplikasi anda sendiri maupun dari sistem. Pesan broadcast yang ingin diterima dapat dibedakan dengan memasukkan filter sebelum receiver didaftarkan pada activity atau aplikasi.

Ada beberapa cara untuk mengimplementasikan BroadcastReceiver ini, dua diantaranya akan saya bahas dalam tulisan ini.

1. Sebagai kelas yang berdiri sendiri

Berikut adalah bagaimana sebuah kelas BroadcastReceiver umumnya diimplementasikan:

Seperti yang dapat anda lihat pada implementasi di atas, BroadcastReceiver hanya memerlukan satu metode yang wajib diimplementasi, yaitu onReceive. Metode inilah yang akan dipanggil ketika receiver menerima pesan. Dalam metode ini, anda dapat mengakses isi pesan dalam bundel ekstra dari intent yang terdapat pada argumen.

Dengan cara ini, anda harus mendaftarkan kelas receiver di atas ke dalam manifest dari aplikasi anda agar kelas receiver anda diketahui oleh aplikasi dan akan dipanggil ketika ada pesan yang datang. Dalam hal ini, anda perlu menambahkan tag <receiver> di dalam tag <application> pada AndroidManifest.xml dari aplikasi anda.

Yang perlu diperhatikan dari tambahan tag di atas adalah:

  1. Nama dari receiver. Sesuai dengan nama kelas turunan BroadcastReceiver yang telah dibuat, “.SmsReceiver”. Simbol titik di depan namanya mereferensikan kepada package aplikasi dasar yang setingkat dengan manifest yang sebenarnya bisa juga anda tulis dengan “com.example.SmsReceiver” (ubah com.example dengan nama package sebenarnya).
  2. Intent filter adalah filter yang akan menyaring jenis pesan yang akan diterima oleh kelas receiver. Dalam hal ini, karena anda ingin kelas receiver mendapat notifikasi dari sistem setiap ada pesan SMS yang masuk ke dalam ponsel, anda harus menggunakan filter “android.provider.Telephony.SMS_RECEIVED” sebagaimana yang ditulis di API Reference
  3. Filter priority menentukan prioritas dari aplikasi anda untuk dipertimbangkan oleh sistem. Semakin tinggi angka ini, maka aplikasi anda akan dianggap lebih penting dari aplikasi lainnya yang memiliki angka prioritas lebih rendah dan kelas receiver andalah yang akan menerima pesannya. Dengan kata lain, apabila pada ponsel pengguna terdapat sebuah aplikasi yang juga menggunakan filter yang sama namun dengan angka priority yang lebih tinggi dari aplikasi anda, maka aplikasi tersebutlah yang akan mendapat dan memroses pesannya sementara receiver dalam aplikasi anda tidak akan melakukan apa-apa.

Berikutnya, untuk mendapat isi pesan sebenarnya dari bundel ekstra dalam intent, anda dapat melakukannya dengan memodifikasi kelas receiver menjadi seperti di bawah.

Sesuai dengan referensi API dalam link yang dicantumkan di atas, isi SMS terdapat di dalam sebuah objek bernama “pdus”. Setelah diekstrak, objek dapat kemudian diubah ke dalam kelas SmsMessage melalui metode createMessageFromPdu. Setelah itu, anda dapat langsung memroses nomor pengirim dan isi pesan sesuai dengan alur aplikasi yang akan anda buat.

Selain cara ini, kelas receiver juga bisa dibuat sebagai kelas dalam dari suatu kelas lain, misalnya dari sebuah activity.

2. Sebagai inner class

Implementasi dari kelas receiver dengan cara ini tidak jauh berbeda dengan cara sebelumnya, hanya saja kali ini kelas receiver ditulis di dalam sebuah kelas lain sebagai inner class.

Sangat identik bukan?

Namun dengan cara ini, anda tidak perlu mendaftarkan kelas receiver ke dalam manifest dari aplikasi anda. Sebagai gantinya, anda perlu menginstansiasi dan mendaftarkan sendiri kelas tersebut setiap kali aktivitas dijalankan dengan memanggil metode registerReceiver dan menutupnya kembali ketika aktivitas dihentikan dengan memanggil metode unregisterReceiver. Hal ini dapat dilakukan dengan cara menimpa implementasi dari onPause dan onResume dalam kelas aktivitas.

Perlu diperhatikan bahwa anda masih harus menentukan intent filter yang akan digunakan pada metode registerReceiver. Mungkin anda bertanya, mengapa receiver lebih baik didaftarkan/ditutup dalam metode onResume/onPause dan bukan dalam onStart/onStop atau bahkan onCreate/onDestroy? Karena metode onResume akan selalu dipanggil baik ketika aktivitas baru dijalankan maupun ketika aktivitas dilanjutkan kembali setelah terhenti. Begitu juga dengan metode onPause, metode ini akan selalu dipanggil baik ketika aktivitas benar-benar dihentikan maupun hanya sekedar dihentikan sementara.

Gimana? Cukup mudah, bukan?