Aplikasi yang selalu aktif dan mode standby sistem

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 sangat memengaruhi masa pakai baterai, 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.
  • Standby: Status daya rendah saat layar diredupkan untuk menghemat daya. Dalam status ini, UI aplikasi Anda masih menempati layar penuh, tetapi sistem dapat mengubah penampilannya dengan mengaburkannya atau melapisi konten seperti waktu. Fitur ini juga disebut sebagai Mode Standby.

Sistem operasi mengontrol transisi antara status ini.

Aplikasi Always-On 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 dijelaskan 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 Status Standby: Setelah pengguna tidak aktif selama jangka waktu tertentu, perangkat akan 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.
  • Di Wear OS 6 dan yang lebih tinggi, jika aplikasi menargetkan SDK 36 atau yang lebih baru, aplikasi tersebut dianggap selalu aktif. Layar meredup, tetapi aplikasi terus berjalan dan tetap terlihat. (Pembaruan mungkin jarang dilakukan, misalnya sekali per menit.)

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 AmbientLifecycleObserver untuk memproses callback pada transisi status.

Menggunakan AmbientLifecycleObserver

Untuk bereaksi terhadap peristiwa mode standby, gunakan class AmbientLifecycleObserver:

  1. Terapkan antarmuka AmbientLifecycleObserver.AmbientLifecycleCallback. Gunakan metode onEnterAmbient() untuk menyesuaikan UI Anda untuk status daya rendah, dan onExitAmbient() untuk memulihkannya ke tampilan interaktif penuh.

    val ambientCallback = object : AmbientLifecycleObserver.AmbientLifecycleCallback {
        override fun onEnterAmbient(ambientDetails: AmbientLifecycleObserver.AmbientDetails) {
            // ... Called when moving from interactive mode into ambient mode.
            // Adjust UI for low-power state: dim colors, hide non-essential elements.
        }
    
        override fun onExitAmbient() {
            // ... Called when leaving ambient mode, back into interactive mode.
            // Restore full UI.
        }
    
        override fun onUpdateAmbient() {
            // ... Called by the system periodically (typically once per minute)
            // to allow the app to update its display while in ambient mode.
        }
    }
    
  2. Buat AmbientLifecycleObserver dan daftarkan ke siklus proses aktivitas atau composable Anda.

    private val ambientObserver = AmbientLifecycleObserver(activity, ambientCallback)
    
    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(ambientObserver)
    
        // ...
    }
    
  3. Panggil removeObserver() untuk menghapus observer di onDestroy().

Untuk developer yang menggunakan Jetpack Compose, library Horologist menyediakan utilitas yang berguna, composable AmbientAware, yang menyederhanakan penerapan pola ini.

TimeText yang sadar akan lingkungan

Sebagai pengecualian untuk mewajibkan pengamat kustom, di Wear OS 6, widget TimeText dapat beradaptasi dengan mode standby. Waktu diperbarui secara otomatis sekali per menit saat perangkat berada dalam status Ambient tanpa kode tambahan.

Mengontrol durasi aktif layar

Bagian berikut menjelaskan cara mengelola durasi aplikasi Anda tetap berada di layar.

Mencegah kembali ke tampilan jam dengan Aktivitas yang Sedang Berlangsung

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 yang sedang berlangsung memberikan cara sekali ketuk bagi mereka untuk kembali ke aplikasi Anda

Untuk mengimplementasikannya, intent sentuh notifikasi berkelanjutan harus mengarah ke aktivitas selalu aktif Anda, seperti yang ditunjukkan dalam cuplikan kode berikut:

private fun createNotification(): Notification {
    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)

    return 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 flag jendela FLAG_KEEP_SCREEN_ON. Fungsi ini berfungsi sebagai kunci tetap aktif, yang membuat perangkat tetap dalam status Interaktif. Gunakan 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 dalam kondisi daya rendah dan menghemat baterai secara signifikan dengan membatasi piksel cerah.
    • Biarkan setidaknya 85% layar berwarna hitam.
    • Hanya tampilkan informasi yang paling penting, dengan memindahkan detail sekunder ke tampilan interaktif.
    • Gunakan garis luar untuk ikon atau tombol besar, bukan pengisian solid.
    • Hindari blok besar warna solid dan branding atau gambar latar belakang yang tidak berfungsi.
  • Menangani data dinamis yang tidak berlaku lagi
    • Callback onUpdateAmbient() hanya 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 -- menjadi tidak berlaku di antara pembaruan. Untuk menghindari menampilkan informasi yang menyesatkan dan salah, dengarkan callback onEnterAmbient, dan ganti nilai aktif ini dengan konten placeholder statis, seperti --.
  • Mempertahankan tata letak yang konsisten
    • Pertahankan posisi elemen yang sama di seluruh mode Interaktif dan Standby untuk menciptakan transisi yang lancar.
    • Selalu tampilkan waktu.
  • Pahami konteks
    • Jika pengguna sedang berada di layar setelan atau konfigurasi saat perangkat memasuki mode standby, pertimbangkan untuk menampilkan layar yang lebih relevan dari aplikasi Anda, bukan tampilan setelan.
  • Menangani persyaratan khusus perangkat
    • Dalam objek AmbientDetails yang diteruskan ke onEnterAmbient():
      • Jika deviceHasLowBitAmbient adalah true, nonaktifkan anti-aliasing jika memungkinkan.
      • Jika burnInProtectionRequired adalah true, geser elemen UI sedikit secara berkala dan hindari area putih yang menyala terus untuk mencegah burn-in layar.

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:

  1. Terapkan AmbientLifecycleObserver untuk menangani perubahan UI antara status Interaktif dan Ambient, seperti meredupkan layar dan menghapus data yang tidak penting.
  2. Buat tata letak baru berdaya rendah untuk status Ambient yang mengikuti praktik terbaik.
  3. Gunakan Ongoing Activity API 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 AmbientAware dari library Horologist untuk menyederhanakan penanganan mode standby di Compose.