Panduan ini memberikan ringkasan tentang cara mendukung kasus penggunaan utama untuk berkomunikasi dengan perangkat periferal saat aplikasi Anda berjalan di latar belakang:
Ada beberapa opsi untuk mendukung setiap kasus penggunaan ini. Masing-masing memiliki manfaat dan kekurangan yang mungkin membuatnya lebih atau kurang sesuai dengan kebutuhan spesifik Anda.
Diagram berikut menunjukkan tampilan sederhana panduan di halaman ini:
Temukan perangkat
Pertama, aplikasi Anda harus menemukan perangkat yang akan dihubungkan. Untuk menemukan perangkat BLE, Anda dapat menggunakan salah satu API berikut:
BluetoothLeScanner
seperti yang dijelaskan dalam Menemukan perangkat BLE. (Contoh)CompanionDeviceManager
seperti yang dijelaskan dalam Penyambungan perangkat pendamping. (Contoh)
Di latar belakang
Tidak ada batasan untuk menggunakan salah satu API ini saat aplikasi tidak terlihat, tetapi keduanya memerlukan proses aplikasi Anda untuk tetap aktif. Jika proses aplikasi tidak berjalan, Anda dapat menggunakan solusi berikut:
- Untuk
BluetoothLeScanner
: PanggilstartScan()
dengan objekPendingIntent
, bukan objekScanCallback
, untuk mendapatkan notifikasi saat perangkat yang cocok dengan filter Anda dipindai. (Contoh) - Untuk
CompanionDeviceManager
: Ikuti panduan di Membuat aplikasi pendamping tetap aktif untuk mengaktifkan aplikasi dan membuatnya tetap aktif saat perangkat yang sebelumnya dikaitkan berada dalam jangkauan. (Contoh)
Hubungkan ke perangkat
Untuk terhubung ke perangkat setelah menemukannya, Anda perlu mendapatkan
instance BluetoothDevice
untuk
perangkat dari salah satu sumber berikut:
- Hasil pemindaian
BluetoothLeScanner
seperti yang dijelaskan di bagian sebelumnya. - Daftar perangkat terikat yang diambil dari
BluetoothAdapter.getBondedDevices()
. - Cache
BluetoothAdapter
, menggunakanBluetoothAdapter.getRemoteLeDevice()
.
Setelah memiliki instance BluetoothDevice
, Anda dapat memulai permintaan koneksi
ke perangkat yang sesuai dengan memanggil salah satu
metode
connectGatt()
. Nilai yang Anda teruskan ke boolean autoConnect
menentukan dari
dua mode koneksi berikut yang digunakan klien GATT:
- Koneksi langsung (
autoconnect = false
): Mencoba terhubung ke perangkat periferal secara langsung, dan gagal jika perangkat tidak tersedia. Jika koneksi terputus, klien GATT tidak akan otomatis mencoba terhubung kembali. - Terhubung otomatis (
autoconnect = true
): Mencoba terhubung secara otomatis ke perangkat periferal setiap kali tersedia. Jika terjadi pemutusan koneksi yang dimulai oleh periferal atau karena periferal berada di luar jangkauan, klien GATT akan otomatis mencoba terhubung kembali saat periferal tersedia.
Di latar belakang
Tidak ada batasan untuk terhubung ke perangkat saat aplikasi berada di latar belakang, meskipun koneksi ditutup jika proses Anda dihentikan. Selain itu, ada batasan untuk memulai aktivitas (di Android 10 dan yang lebih tinggi) atau layanan latar depan (di Android 12 dan yang lebih tinggi) dari latar belakang.
Jadi, untuk melakukan koneksi saat berada di latar belakang, aplikasi dapat menggunakan solusi berikut:
- Gunakan WorkManager untuk terhubung ke
perangkat Anda.
- Anda dapat menetapkan
PeriodicWorkRequest
atauOneTimeWorkRequest
untuk melakukan tindakan yang ditentukan, meskipun batasan aplikasi mungkin berlaku. - Selain itu, Anda dapat memanfaatkan fitur WorkManager seperti batasan pekerjaan, pekerjaan yang dipercepat, kebijakan percobaan ulang, dan lainnya.
- Jika koneksi harus dipertahankan selama mungkin untuk melakukan tugas, seperti sinkronisasi data atau polling dari perangkat periferal, Anda perlu memulai layanan latar depan dengan mengikuti panduan di Dukungan untuk pekerja yang berjalan lama. Namun, pembatasan peluncuran layanan latar depan berlaku mulai Android 12.
- Anda dapat menetapkan
- Mulai layanan latar depan dengan jenis
connectedDevice
.- Jika koneksi harus dipertahankan selama mungkin untuk melakukan tugas, seperti sinkronisasi data atau polling dari perangkat periferal, Anda perlu memulai layanan latar depan dengan mengikuti panduan di Dukungan untuk pekerja yang berjalan lama. Namun, pembatasan peluncuran layanan latar depan berlaku mulai Android 12.
- Panggil
startScan()
dengan objekPendingIntent
seperti yang dijelaskan dalam Menemukan perangkat untuk mengaktifkan proses Anda saat perangkat ada. Perangkat periferal harus beriklan.- Sebaiknya Anda memulai Pekerja dan Tugas. Hal ini mungkin terganggu oleh sistem sehingga hanya dapat mendukung komunikasi berdurasi singkat.
- Pada versi yang lebih rendah dari Android 12, Anda dapat memulai layanan latar depan
langsung dari objek
PendingIntent
.
- Gunakan
CompanionDeviceService
dan salah satu izinREQUEST_COMPANION_RUN_IN_BACKGROUND
atauREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
untuk memulai layanan dari latar belakang.
Tetap terhubung ke perangkat
Idealnya, aplikasi harus mempertahankan koneksi ke perangkat periferal hanya selama diperlukan, dan memutuskan koneksi setelah tugas selesai. Namun, ada dua kasus saat aplikasi mungkin perlu mempertahankan koneksi tanpa batas waktu:
Dalam kedua kasus tersebut, opsi berikut tersedia:
- Gunakan
CompanionDeviceService
dengan izinREQUEST_COMPANION_RUN_IN_BACKGROUND
dan metodeCompanionDeviceManager.startObservingDevicePresence()
. - Mulai layanan latar depan saat
aplikasi berada di latar depan (atau dalam salah satu
pengecualian)
dengan
jenis latar depan
connectedDevice
.
Saat beralih antar-aplikasi
Menemukan perangkat, menghubungkan ke perangkat, dan mentransfer data memerlukan waktu dan
memerlukan banyak resource. Untuk menghindari kehilangan koneksi dan harus melakukan proses
lengkap setiap kali pengguna beralih antar-aplikasi atau melakukan tugas
serentak, Anda harus mempertahankan koneksi hingga operasi selesai. Anda
dapat menggunakan layanan latar depan dengan jenis connectedDevice
atau
API kehadiran
perangkat pendamping.
Saat mendengarkan notifikasi periferal
Untuk memproses notifikasi periferal, aplikasi harus memanggil
setCharacteristicNotification()
,
memproses callback menggunakan
onCharacteristicChanged()
,
dan mempertahankan koneksi. Untuk sebagian besar aplikasi, sebaiknya dukung kasus penggunaan ini
dengan CompanionDeviceService
karena aplikasi kemungkinan perlu terus memproses
selama jangka waktu yang lama. Namun, Anda juga dapat menggunakan layanan latar depan.
Dalam kedua kasus tersebut, Anda dapat terhubung kembali setelah proses dihentikan dengan mengikuti petunjuk di bagian Menghubungkan ke perangkat.