Panduan ini menjelaskan cara membuat aplikasi Anda selalu aktif, cara bereaksi terhadap transisi status daya, dan cara mengelola perilaku aplikasi untuk memberikan pengalaman pengguna yang baik sekaligus menghemat baterai.
Membuat aplikasi terus terlihat akan memengaruhi masa pakai baterai secara signifikan, jadi pertimbangkan dampak daya saat menambahkan fitur ini.
Konsep Utama
Saat ditampilkan di layar penuh, aplikasi Wear OS berada dalam salah satu dari dua status daya:
- Interaktif: Status daya tinggi saat layar berada pada kecerahan penuh, sehingga memungkinkan interaksi pengguna penuh.
- Ambient: Status daya rendah saat layar meredup untuk menghemat daya. Dalam status ini, UI aplikasi Anda masih menempati layar penuh, tetapi sistem dapat mengubah penampilannya dengan mengaburkannya atau menampilkan konten overlay seperti waktu. Fitur ini juga disebut sebagai Mode Standby.
Sistem operasi mengontrol transisi antara status ini.
Aplikasi Selalu Aktif adalah aplikasi yang menampilkan konten dalam status Interaktif dan Standby.
Jika aplikasi selalu aktif terus menampilkan UI-nya sendiri saat perangkat berada dalam status Ambient daya rendah, aplikasi tersebut dideskripsikan berada dalam mode ambiactive.
Transisi sistem dan perilaku default
Saat aplikasi berada di latar depan, sistem mengelola transisi status daya berdasarkan dua waktu tunggu yang dipicu oleh ketidakaktifan pengguna.
- Waktu tunggu #1: Status Interaktif ke Standby: Setelah periode tidak ada aktivitas pengguna, perangkat memasuki status Standby.
- Waktu tunggu #2: Kembali ke tampilan jam: Setelah tidak ada aktivitas selama jangka waktu tertentu, sistem dapat menyembunyikan aplikasi saat ini dan menampilkan tampilan jam.
Segera setelah sistem melewati transisi pertama ke status Ambient, perilaku default bergantung pada versi Wear OS dan konfigurasi aplikasi Anda:
- Di Wear OS 5 dan yang lebih lama, sistem menampilkan screenshot buram dari aplikasi Anda yang dijeda, dengan waktu yang ditampilkan di atasnya. Status ini diwakili oleh node "AOD Lite" dalam diagram alur berikut.
- Di Wear OS 6 dan yang lebih tinggi, jika aplikasi menargetkan SDK 36 atau yang lebih baru, aplikasi tersebut dianggap selalu aktif. Layar diredupkan, tetapi aplikasi terus berjalan dan tetap terlihat. (Pembaruan mungkin jarang dilakukan, bahkan hanya sekali per menit.) Status ini direpresentasikan oleh node "Global AOD" dalam diagram alir berikut.
Menyesuaikan perilaku untuk status Standby
Terlepas dari perilaku sistem default, di semua versi Wear OS, Anda dapat
menyesuaikan tampilan atau perilaku aplikasi saat dalam status Ambient dengan
menggunakan LocalAmbientModeManager untuk mengamati transisi status di
Jetpack Compose di Wear OS. Status ini diwakili oleh node "Mode Ambiactive"
di diagram alur berikut.
Mengamati status sekitar
Untuk bereaksi terhadap peristiwa mode standby di Jetpack Compose di Wear OS:
Gunakan
LocalAmbientModeManageruntuk mengamati perubahan pada status mode sekitar sistem, dan sesuaikan composable Anda. Konfigurasi komponen Anda untuk menyesuaikan ke mode daya yang lebih rendah dalam statusAmbientMode.Ambient, dan pulihkan ke tampilan interaktif penuh dalam statusAmbientMode.Interactive.// In a production application, the AmbientModeManager should be instantiated and provided at // the highest level of the Compose hierarchy (typically in the host Activity's setContent // block) using a CompositionLocalProvider. This ensures proper lifecycle management and // broad accessibility. // For this self-contained demo, AmbientModeManager is created and provided locally: val activityAmbientModeManager = rememberAmbientModeManager() CompositionLocalProvider(LocalAmbientModeManager provides activityAmbientModeManager) { val ambientModeManager = LocalAmbientModeManager.current val ambientMode = ambientModeManager?.currentAmbientMode if (ambientModeManager != null) { ambientModeManager.AmbientTickEffect { // While device is in ambient mode, update properties every minute or so // ... } } // ... val ambientModeName = when (ambientMode) { is AmbientMode.Interactive -> "Interactive" is AmbientMode.Ambient -> "Ambient" else -> "Unknown" } Text(text = "$ambientModeName Mode") // ... }
Diagram alir perilaku sekitar
Diagram alur berikut menggambarkan cara sistem menentukan perilaku sekitar berdasarkan versi Wear OS perangkat, targetSdkVersion aplikasi Anda, dan apakah aplikasi mengamati transisi status sekitar (menggunakan LocalAmbientModeManager atau AmbientLifecycleCallback).
Mengontrol durasi aktif layar
Bagian berikut menjelaskan cara mengelola durasi aplikasi Anda tetap berada di layar.
Mencegah kembali ke tampilan jam dengan Aktivitas Berkelanjutan atau Pembaruan Langsung
Setelah jangka waktu tertentu dalam status Ambient (Waktu tunggu #2), sistem biasanya akan kembali ke tampilan jam. Pengguna dapat mengonfigurasi durasi waktu tunggu di setelan sistem. Untuk kasus penggunaan tertentu, seperti pengguna yang melacak latihan fisik, aplikasi mungkin perlu tetap terlihat lebih lama.
Di Wear OS 5 dan yang lebih tinggi, Anda dapat mencegah hal ini dengan menerapkan Aktivitas Berkelanjutan. Jika aplikasi Anda menampilkan informasi tentang tugas pengguna yang sedang berlangsung, seperti sesi latihan fisik, Anda dapat menggunakan Ongoing Activity API agar aplikasi Anda tetap terlihat hingga tugas berakhir. Jika pengguna kembali ke tampilan jam secara manual, indikator aktivitas berkelanjutan memberikan cara sekali ketuk bagi mereka untuk kembali ke aplikasi Anda.
Atau, di Wear OS 7 dan yang lebih tinggi, Anda dapat menggunakan Update Langsung sebagai pengganti Aktivitas Berkelanjutan. Untuk kompatibilitas mundur, terus dukung Aktivitas Berkelanjutan di perangkat yang menjalankan Wear OS 6 atau yang lebih lama.
Untuk mengimplementasikannya, intent sentuh notifikasi berkelanjutan harus mengarah ke aktivitas selalu aktif Anda, seperti yang ditunjukkan dalam cuplikan kode berikut:
val activityIntent = Intent(this, AlwaysOnActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_SINGLE_TOP } val pendingIntent = PendingIntent.getActivity( this, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) val notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID) // ... // ... .setOngoing(true) // ... val ongoingActivity = OngoingActivity.Builder(applicationContext, NOTIFICATION_ID, notificationBuilder) // ... // ... .setTouchIntent(pendingIntent) .build() ongoingActivity.apply(applicationContext) val notification = notificationBuilder.build()
Menjaga layar tetap aktif dan mencegah status Ambient
Dalam kasus yang jarang terjadi, Anda mungkin perlu mencegah perangkat sepenuhnya memasuki status
Ambient. Yaitu, untuk menghindari Waktu Tunggu #1. Untuk melakukannya, Anda dapat menggunakan pengubah
keepScreenOn. Ini berfungsi sebagai penguncian layar saat aktif, yang menjaga perangkat dalam status Interaktif. Gunakan fitur ini dengan sangat hati-hati karena akan sangat memengaruhi daya tahan baterai.
Rekomendasi untuk Mode standby
Untuk memberikan pengalaman pengguna terbaik dan menghemat daya dalam mode Ambient, ikuti pedoman desain ini. Rekomendasi ini memprioritaskan pengalaman pengguna yang jelas, dengan mencegah informasi yang menyesatkan dan mengurangi kekacauan visual, sekaligus mengoptimalkan daya tampilan.
- Mengurangi kekacauan visual dan daya tampilan. UI yang bersih dan minimalis memberi sinyal kepada pengguna bahwa aplikasi berada dalam status daya rendah dan menghemat baterai secara signifikan dengan membatasi piksel cerah.
- Pertahankan setidaknya 85% layar berwarna hitam (rasio piksel aktif 15% atau kurang).
- Hanya tampilkan informasi yang paling penting, dengan memindahkan detail sekunder ke tampilan interaktif.
- Gunakan garis luar untuk ikon atau tombol besar, bukan pengisian solid, sesuaikan kontras garis luar agar elemen tetap mudah dibaca tanpa menimbulkan risiko layar berkedip atau burn-in.
- Hindari blok besar warna solid dan branding atau gambar latar belakang yang tidak berfungsi.
- Menangani data dan animasi dinamis yang tidak berlaku lagi
- Callback
AmbientTickEffecthanya dipanggil secara berkala -- biasanya sekali per menit -- untuk menghemat daya. Karena batasan ini, setiap data yang sering berubah -- seperti stopwatch, detak jantung, atau jarak latihan fisik -- menjadi tidak berlaku di antara pembaruan. Untuk menghindari menampilkan informasi yang menyesatkan dan salah, ganti nilai aktif ini dengan konten placeholder statis, seperti--. - Hapus indikator progres yang memerlukan pembaruan sering agar berguna untuk konteks atau situasi pengguna saat ini, seperti ring progres untuk sesi media singkat. Anda dapat mempertahankan indikator progres jika pembaruan sekali per menit masih memberikan nilai, seperti untuk timer yang lama.
- Menjeda atau menghapus semua animasi dalam mode sekitar, termasuk indikator progres animasi dan teks marquee yang di-scroll.
- Callback
- Pertahankan tata letak yang konsisten
- Pertahankan posisi elemen yang sama di seluruh mode Interaktif dan Ambient untuk menciptakan transisi yang lancar. Elemen UI interaktif seperti tombol dapat tetap terlihat karena perangkat Wear OS modern mendukung input sentuh selama sesi standby.
- Selalu menampilkan waktu saat ini. Di Jetpack Compose untuk Wear OS,
TimeText(disertakan secara default diScreenScaffold) memiliki kemampuan deteksi lingkungan dan otomatis diperbarui sekali per menit dalam mode sekitar.
- Pahami konteks
- Jika pengguna berada di layar setelan atau konfigurasi saat perangkat masuk ke mode standby, pertimbangkan untuk menampilkan layar yang lebih relevan dari aplikasi Anda, bukan tampilan setelan.
- Menangani persyaratan spesifik per perangkat
- Jika
currentAmbientModemenampilkanAmbientMode.Ambient:- Jika
isLowBitAmbientSupportedadalahtrue, tampilan mendukung lebih sedikit bit per warna dalam mode standby. Nonaktifkan anti-aliasing (misalnya, dalam operasi gambarCanvasatauPaintkustom) dan hindari gradien warna jika memungkinkan. - Jika
isBurnInProtectionRequiredadalahtrue, sistem akan secara berkala mengubah konten tampilan untuk mencegah burn-in piksel. Jangan menggeser elemen UI di aplikasi Anda secara manual. Sebagai gantinya, hindari area putih solid dan tempatkan elemen UI penting setidaknya 10 piksel dari tepi layar agar tidak terpotong saat sistem menggeser layar. (Tata letak Compose Wear standar sepertiScreenScaffoldsudah memberikan padding tepi yang memadai.)
- Jika
- Jika
Proses debug dan pengujian
Perintah adb ini mungkin berguna saat mengembangkan atau menguji perilaku aplikasi Anda saat perangkat dalam mode sekitar:
# put device in ambient mode if the always on display is enabled in settings
# (and not disabled by other settings, such as theatre mode)
$ adb shell input keyevent KEYCODE_SLEEP
# put device in interactive mode
$ adb shell input keyevent KEYCODE_WAKEUP
Contoh: Aplikasi latihan fisik
Pertimbangkan aplikasi latihan fisik yang perlu menampilkan metrik kepada pengguna selama durasi sesi latihan fisik mereka. Aplikasi harus tetap terlihat melalui transisi status Ambient dan tidak digantikan oleh tampilan jam.
Untuk melakukannya, developer harus melakukan hal berikut:
- Gunakan
LocalAmbientModeManageruntuk menangani perubahan UI antara status Interaktif dan Ambient, seperti meredupkan layar dan menghapus data yang tidak penting. - Buat tata letak baru berdaya rendah untuk status Ambient yang mengikuti praktik terbaik.
- Gunakan Ongoing Activity API (atau Live Updates di Wear OS 7 dan yang lebih tinggi) selama latihan untuk mencegah sistem kembali ke tampilan jam.
Untuk implementasi lengkap, lihat contoh Latihan berbasis Compose di
GitHub. Contoh ini juga menunjukkan penggunaan composable
LocalAmbientModeManager untuk menyederhanakan penanganan mode sekitar
di Compose.