7.3: Penerima Siaran
Daftar Isi:
- Yang harus sudah Anda KETAHUI
- Yang akan Anda PELAJARI
- Yang akan Anda LAKUKAN
- Tugas 1. Menyiapkan Proyek PowerReceiver
- Tugas 2. Mengirimkan dan Menerima Siaran Khusus
- Tantangan penyusunan kode
- Rangkuman
- Konsep terkait
Beberapa peristiwa yang bisa terjadi dalam sistem Android mungkin berdampak pada fungsionalitas aplikasi yang dipasang pada perangkat. Misalnya, jika sistem sudah selesai booting, Anda mungkin ingin aplikasi cuaca memperbarui informasinya. Framework Android menanganinya dengan mengirimkan siaran sistem yang berisi Intent yang seharusnya diterima menggunakan BroadcastReceivers. BroadcastReceiver adalah kelas dasar untuk kode yang akan menerima Intent yang dikirimkan oleh sendBroadcast()
. Ada dua kelas utama siaran yang dapat diterima:
- Siaran normal (yang dikirimkan dengan Context.sendBroadcast()) sangat asinkron. Semua penerima siaran dijalankan dalam urutan yang tidak ditentukan, sering kali pada saat yang bersamaan. Ini lebih efisien, namun ini berarti penerima tidak dapat menggunakan hasil atau membatalkan API yang disertakan di sini.
- Siaran pesanan (yang dikirim dengan Context.sendOrderedBroadcast) dikirim ke satu penerima pada satu waktu. Karena setiap penerima mengeksekusi secara bergantian, hal ini dapat menyebarkan hasil ke penerima selanjutnya, atau bisa membatalkan siaran agar tidak diteruskan ke penerima. Perintah yang dijalankan penerima dapat dikontrol dengan atribut android:priority dari filter intent yang cocok; penerima dengan prioritas yang sama akan dijalankan dalam urutan yang acak.
Bahkan dalam kasus siaran normal, dalam beberapa situasi sistem mungkin kembali menyampaikan siaran ke satu penerima di satu waktu. Secara khusus, untuk penerima yang mungkin memerlukan pembuatan proses, hanya satu yang akan dijalankan pada satu waktu agar sistem tidak kelebihan beban dengan proses yang baru. Namun, dalam situasi ini, semantik yang tidak diperintahkan bertahan: penerima ini tetap tidak bisa mengembalikan hasil atau menghentikan siarannya.
Selain itu, Anda bisa membuat Intent dengan tindakan khusus dan menyiarkannya sendiri dari aplikasi menggunakan metodesendBroadcast()
. Broadcast akan diterima oleh semua aplikasi dengan BroadcastReceiver yang terdaftar untuk tindakan tersebut. Untuk mengetahui selengkapnya tentang Intent dan penerima Siaran, buka dokumentasi Intent.
Catat bahwa meskipun kelas Intent digunakan untuk mengirim dan menerima siaran, mekanisme siaran Intent sepenuhnya terpisah dari Intent yang digunakan untuk memulai Aktivitas.
Dalam praktik ini, Anda akan membuat aplikasi yang merespons perubahan dalam status pengisian daya perangkat, dan mengirimkan serta menerima Intent Siaran khusus.
Yang harus sudah Anda KETAHUI
Sebelum praktik ini Anda harus bisa:
- Mengidentifikasi bagian kunci file AndroidManifest.xml.
- Membuat Intent Implisit.
Yang akan Anda PELAJARI
Dalam praktik ini Anda akan belajar:
- Membuat subkelas dan mengimplementasikan BroadcastReceiver.
- Mendaftar intent Siaran sistem.
- Membuat dan mengirim intent Siaran khusus.
Yang akan Anda LAKUKAN
Dalam praktik ini Anda akan:
- Membuat subkelas BroadcastReceiver untuk menampilkan Toast saat siaran diterima.
- Mendaftarkan penerima untuk mendengarkan siaran sistem.
- Mengirimkan dan menerima intent siaran khusus.
Ringkasan aplikasi
Aplikasi PowerReceiver akan mendaftarkan BroadcastReceiver yang menampilkan pesan Toast saat perangkat terhubung atau terputus dari aliran listrik. Aplikasi ini juga akan mengirimkan dan menerima Intent Broadcast khusus untuk menampilkan pesan Toast yang berbeda.
Tugas 1. Menyiapkan Proyek PowerReceiver
1.1 Membuat Proyek
- Membuat proyek baru bernama PowerReceiver, menerima opsi default dan menggunakan template Empty.
- Membuat Penerima Siaran baru. Pilih nama paket dalam Tampilan Proyek Android dan buka File > New > Other > Broadcast Receiver.
Beri nama kelasnya CustomReceiver dan pastikan "Exported" dan "Enabled" dicentang.
Catatan: Fitur "Exporter" mengizinkan aplikasi untuk merespons ke siaran luar, sementara "Enabled" mengizinkannya dibuat instance oleh sistem.Buka file manifes Android. Ingat bahwa Android Studio secara otomatis membuat tag
<receiver>
dengan opsi terpilih sebagai atribut. BroadcastReceivers juga bisa didaftarkan secara program, tetapi lebih mudah mendefinisikannya dalam manifes.
1.2 Mendaftarkan Penerima untuk siaran sistem
Untuk menerima siaran apa pun, pertama-tama Anda perlu menentukan intent siaran mana yang Anda minati. Dalam dokumentasi Intent, di bawah "Standard Broadcast Actions", Anda bisa menemukan beberapa intent siaran umum yang dikirimkan oleh sistem. Dalam aplikasi ini, Anda akan memperhatikan dua siaran tertentu: ACTION_POWER_CONNECTED
dan ACTION_POWER_DISCONNECTED
. BroadcastReceivers mendaftarkan siaran seperti Anda mendaftarkan aktivitas untuk Intent implisit: Anda menggunakan filter intent. Anda sudah belajar tentang intent implisit pada praktik sebelumnya.
- Dalam file AndroidManifest.xml, tambahkan kode berikut di antara tag
<receiver>
untuk mendaftarkan Penerima Anda untuk Intent sistem:<intent-filter> <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> </intent-filter>
1,3 Mengimplementasikan onReceive() dalam BroadcastReceiver
Saat BroadcastReceiver menghalangi siaran yang didaftarkan, Intent dikirimkan ke metode onReceive()
pengguna, bersama dengan konteks tempat penerima berjalan.
- Buka file CustomReceiver, dan hapus implementasi default dalam metode
onReceive()
. - Dapatkan tindakan dari intent dan simpan dalam variabel
String
bernamaintentAction
:@Override public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); }
- Buat pernyataan
switch
dengan stringintentAction
, agar aplikasi dapat menampilkan pesan toast yang berbeda untuk setiap tindakan spesifik yang didaftarkan kepada penerima:switch (intentAction){ case Intent.ACTION_POWER_CONNECTED: break; case Intent.ACTION_POWER_DISCONNECTED: break; }
- Inisialisasi variabel
String
bernamatoastMessage
sebelum pernyataanswitch
, dan jadikan nilainyanull
agar bisa disetel tergantung pada tindakan siaran yang Anda terima. - Tetapkan
toastMessage
ke "Power connected!" jika tindakannyaACTION_POWER_CONNECTED
, dan "Power disconnected!" jikaACTION_POWER_DISCONNECTED
. Ekstrak sumber daya string. - Tampilkan pesan toast untuk durasi pendek setelah pernyataan switch:
Toast.makeText(context, toastMessage, Toast.LENGTH_SHORT).show();
Jalankan aplikasi Anda. Setelah dipasang, cabut perangkat. Proses ini mungkin memakan beberapa waktu saat pertama kali dilakukan, tetapi toast pasti ditampilkan setiap kali Anda mencolokkan atau mencabut perangkat.
Catatan: Jika menggunakan emulator, Anda dapat mengubah status sambungan daya dengan memilih ikon elips untuk menu tersebut, pilih Battery pada bilah kiri, dan ubah menggunakan setelan Sambungan pengisi daya.
1.4 Membatasi Penerima Siaran
Penerima Siaran selalu aktif, sehingga aplikasi tidak perlu berjalan agar metode onReceive()
dipanggil.
Silakan coba: tutup aplikasi, colok dan cabut perangkat.
Pesan toast tetap ditampilkan!
Anda memiliki banyak tanggung jawab, sebagai developer, untuk tidak membuat bingung pengguna dengan notifikasi atau fungsionalitas yang tidak diinginkan setiap kali siaran terjadi. Pada contoh ini, pesan Toast yang muncul setiap kali status daya berubah dapat mengganggu pengguna. Untuk membatasinya, Anda akan menambahkan beberapa kode untuk memastikan penerima siaran hanya aktif saat aplikasi ditampilkan.
Kelas PackageManager bertanggung jawab untuk mengaktifkan dan menonaktifkan komponen Android tertentu (seperti layanan, aktivitas, atau penerima siaran). Ini bisa dilakukan menggunakan metode
setComponentEnabledSetting()
yang memerlukan tiga argumen:- ComponentName (identifier untuk komponen yang ingin diaktifkan atau dinonaktifkan).
- Salah satu dari konstanta kelas PackageManager yang mewakili status aktif suatu komponen. Dalam aplikasi ini kita akan menggunakan
PackageManager.COMPONENT_ENABLED_STATE_ENABLED
danPackageManager.COMPONENT_ENABLED_STATE_DISABLED
. Lihat referensi PackageManager untuk konstanta lainnya. - Konstanta bendera opsional yang memerintahkan sistem untuk tidak memusnahkan aplikasi saat mengubah status komponen:
PackageManager.DONT_KILL_APP
.
Agar penerima siaran hanya aktif ketika aplikasi ditampilkan, aktifkan penerima dalam
onStart()
dan nonaktifkan dalamonStop()
.- Buat dua variabel anggota: PackageManager dan ComponentName.
Inisialisasi keduanya di
onCreate()
.Inisialisasi PackageManager dengan
getPackageManager()
. Konstruktor untuk ComponentName memerlukan konteks aplikasi dan nama kelas komponen:mReceiverComponentName = new ComponentName(this, CustomReceiver.class); mPackageManager = getPackageManager();
- Ganti
onStart()
danonStop()
:@Override protected void onStart() { super.onStart(); } @Override protected void onStop() { super.onStop(); }
- Panggil
setComponentEnabledSetting()
di PackageManager dalamonStart()
. Teruskan nama Komponen, konstantaPackageManager.COMPONENT_ENABLED_STATE_ENABLED
, dan benderaDONT_KILL_APP
:mPackageManager.setComponentEnabledSetting (mReceiverComponentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
- Dalam
onStop()
, gunakan PackageManager untuk menonaktifkan CustomReceiver, menggunakan konstantaPackageManager.COMPONENT_ENABLED_STATE_DISABLED
:mPackageManager.setComponentEnabledSetting (mReceiverComponentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
Tugas 2. Mengirimkan dan Menerima Siaran Khusus
Selain merespons siaran sistem, aplikasi juga dapat mengirimkan dan menerima Intent Siaran khusus. Intent siaran khusus sama persis dengan sistem, namun di sini Anda harus mendefinisikan tindakan Intent sendiri untuknya (string unik) dan tindakannya dikirimkan menggunakan metode sendBroadcast()
. Pada tugas ini, Anda akan menambahkan tombol ke aktivitas yang mengirimkan Intent Siaran khusus, yang akan didaftarkan oleh penerima dan ditampilkan dalam pesan Toast.
2.1 Mendefinisikan string Tindakan Siaran khusus
Pengirim dan penerima siaran khusus harus menyetujui string tindakan untuk Intent Siaran. Membuat string tindakan unik dengan menambahkan Nama Tindakan di depannya dengan nama paket adalah praktik yang biasa.
- Buat variabel
String
konstan dalam MainActivity dan kelas CustomReceiver untuk digunakan sebagai Tindakan Intent Siaran (ini adalah string tindakan khusus):private static final String ACTION_CUSTOM_BROADCAST = "com.example.android.powerreceiver.ACTION_CUSTOM_BROADCAST";
2.2 Tambahkan Tombol "Send Custom Broadcast"
- Dalam file activity_main.xml, tambahkan tampilan Tombol dengan atribut berikut:
Atribut
Nilai
android:id
"@+id/sendBroadcast"
android:layout_width
wrap_content
android:layout_height
wrap_content
android:text
"Send Custom Broadcast"
android:layout_margin
"8dp"
android:onClick
"sendCustomBroadcast"
- Ekstrak sumber daya string.
- Buat stub untuk metode
sendCustomBroadcast()
: Klik pada nama metode onClick. Tekan Alt (Option untuk pengguna Mac) + Enter dan pilih 'Create 'sendCustomBroadcast(View)' dalam 'MainActivity'.
2.3 Mengimplementasikan sendCustomBroadcast()
Karena siaran ini ditujukan untuk digunakan hanya oleh aplikasi Anda, gunakan LocalBroadcastManager untuk mengelola siaran dalam aplikasi. LocalBroadcastManager adalah kelas yang mengizinkan Anda untuk mendaftar dan mengirim siaran Intent ke objek lokal dalam aplikasi. Dengan menjaga siaran tetap lokal, data aplikasi tidak akan dibagikan dengan aplikasi Android lainnya, menjadikan informasi lebih aman dan memelihara efisiensi sistem.
- Dalam metode
sendCustomBroadcast()
di MainActivity, buat Intent baru, dengan string tindakan khusus sebagai argumen.Intent customBroadcastIntent = new Intent(ACTION_CUSTOM_BROADCAST);
- Kirimkan siaran menggunakan kelas LocalBroadcastManager:
LocalBroadcastManager.getInstance(this).sendBroadcast(customBroadcastIntent);
2.4 Mendaftarkan Siaran Khusus
Untuk siaran sistem, Anda mendaftarkan penerima dalam file AndroidManifest.xml. Anda juga bisa mendaftarkan penerima untuk tindakan spesifik secara terprogram. Untuk siaran yang dikirim menggunakan LocalBroadcastManager, pendaftaran statis dalam manifes tidak diizinkan.
Jika Anda mendaftarkan penerima siaran secara terprogram, Anda harus berhenti mendaftarkan penerima tersebut ketika tidak diperlukan lagi. Dalam aplikasi, penerima hanya perlu merespons ke siaran khusus saat aplikasi dijalankan agar kita bisa mendaftarkan tindakan tersebut dalam onCreate()
dan berhenti mendaftarkannya di onDestroy()
.
- Buat variabel anggota di MainActivity untuk Penerima dan inisialisasi member tersebut:
private CustomReceiver mReceiver = new CustomReceiver();
- Dalam
onCreate()
, dapatkan instanceLocalBroadcastManager
dan daftarkan penerima dengan tindakan intent khusus:LocalBroadcastManager.getInstance(this) .registerReceiver(mReceiver, new IntentFilter(ACTION_CUSTOM_BROADCAST));
- Ganti metode
onDestroy()
dan berhenti mendaftarkan penerima dariLocalBroadcastManager
:@Override protected void onDestroy() { LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver); super.onDestroy(); }
2.5 Merespons Siaran Khusus
- Dalam
onReceive()
kelas CustomReceiver, tambahkan pernyataan case untuk Tindakan Intent khusus. - Modifikasi pesan toast ke "Custom Broadcast Received", ekstrak ke dalam strings.xml dan panggil
custom_broadcast_toast
(tekan Alt + Enter atau Option + Enter di Mac dan pilih extract string resource):case ACTION_CUSTOM_BROADCAST: toastMessage = context.getString(R.string.custom_broadcast_toast); break;
Catatan: Penerima Siaran yang didaftarkan secara terprogram tidak dipengaruhi oleh proses aktivasi dan penonaktifan yang dilakukan oleh kelas PackageManager, yang ditujukan untuk komponen yang terdaftar dalam file Manifes Android. Mengaktifkan atau menonaktifkan penerima seperti ini dilakukan dengan masing-masing mendaftarkan atau berhenti mendaftarkannya. Dalam hal ini, menonaktifkan toggle "Receiver Enabled" akan menghentikan daya yang terhubung atau pesan toast yang terputus, tetapi tidak pesan Toast Intent Siaran Khususnya.
Itu saja! Aplikasi Anda sekarang memberikan intent Siaran khusus dan dapat menerima sistem dan Siaran khusus.
Kode solusi
Proyek Android Studio: PowerReceiver
Tantangan penyusunan kode
Tantangan: Pola umum untuk penerima siaran adalah memulai pembaruan atau tindakan setelah perangkat selesai booting. Implementasikan Penerima Siaran yang akan menampilkan pesan toast setengah jam setelah perangkat selesai booting.
Rangkuman
- Penerima Siaran adalah salah satu dari komponen dasar aplikasi Android.
- Penerima Siaran dapat menerima Intent yang disiarkan oleh sistem dan aplikasi.
- Mekanisme siaran Intent sepenuhnya terpisah dari Intent yang digunakan untuk memulai Aktivitas.
- Anda perlu membuat subkelas pada kelas BroadcastReceiver dan mengimplementasikan onReceive() untuk memroses Intent yang datang dan terkait dengan siaran.
- Penerima siaran dapat didaftarkan dalam file manifes Android atau secara terprogram.
- Gunakan LocalBroadcastManager untuk mendaftarkan dan mengirimkan Siaran yang bersifat pribadi untuk aplikasi Anda.
- LocalBroadcastManager lebih efisien dan aman dari siaran sistem.
- Untuk siaran yang dikirim menggunakan LocalBroadcastManager, Anda hanya bisa mendaftarkan minat untuk tindakan spesifik secara terprogram.
- Praktik umum untuk membuat nama tindakan Intent yang unik untuk siaran bertujuan untuk menambahkan Nama Tindakan di depan dengan nama paket.
Konsep terkait
Dokumentasi konsep terkait ada di Dasar-Dasar Developer Android: Konsep.
Ketahui selengkapnya
Dokumentasi Developer Android
Panduan
Referensi