The Android Developer Challenge is back! Submit your idea before December 2.

Mengoptimalkan tampilan jam

Tampilan jam Wear OS bekerja terus-menerus sehingga harus menggunakan daya secara efisien.

Selain itu, performa tampilan jam harus dioptimalkan. Layanan tidak boleh melakukan komputasi yang tidak perlu. Tampilan jam dengan animasi harus berjalan lancar dengan tetap mengakomodasi notifikasi dan indikator sistem.

Pengoptimalan dasar

Bagian ini berisi praktik terbaik untuk meningkatkan efisiensi.

Warna dan kecerahan tampilan jam

Warna gelap menghemat baterai jam. Berikut adalah beberapa rekomendasi untuk menyetel latar belakang tampilan jam, untuk mengoptimalkan penggunaan baterai tampilan jam:

  • Warna. Jika memungkinkan, gunakan latar belakang hitam.
  • Kecerahan. Jika persyaratan tampilan jam tidak memungkinkan penggunaan latar belakang hitam, usahakan mempertahankan kecerahan warna latar belakang tidak lebih dari 25 persen pada skala HSV (Hue, Saturation, Value) atau HSB. Misalnya, jika Anda menggunakan class Color untuk menetapkan warna latar belakang, dan menentukan warna dengan skala HSV, sebaiknya gunakan Setelan nilai 25 atau kurang (untuk setelan kecerahan).

Menggunakan callback di WatchFaceService.Engine

Pastikan tampilan jam hanya menjalankan komputasi ketika aktif; gunakan callback dalam WatchFaceService.Engine. Sebaiknya, gunakan metode di bawah dari class tersebut untuk menentukan apakah tampilan jam terlihat:

  • onVisibilityChanged(boolean)
  • isVisible()

Atau, gunakan metode di bawah dari class yang sama (WatchFaceService.Engine):

  • onCreate()
  • onDestroy()

Menggunakan pemroses yang terdaftar dengan antarmuka DataClient

Jika ingin memproses peristiwa, gunakan pemroses aktif yang terdaftar di DataClient.addListener. Untuk contohnya, lihat Menyinkronkan Item Data.

Jangan gunakan WearableListenerService untuk memproses peristiwa, karena layanan ini akan dipanggil baik ketika tampilan jam aktif maupun tidak. Untuk informasi lebih lanjut, lihat Penghentian BIND_LISTENER.

Jangan mendaftarkan penerima siaran dalam file manifes Android untuk mendapatkan peristiwa sistem seperti perubahan zona waktu, peristiwa baterai, dll., karena BroadcastReceiver akan dipanggil baik ketika tampilan jam aktif maupun tidak. Namun, Anda dapat menggunakan metode registerReceiver dari class Context untuk mendaftarkan penerima.

Menggunakan kemampuan dinamis untuk berinteraksi dengan telepon

Saat tampilan jam mengharuskan sebuah operasi untuk dijalankan di ponsel, kode tersebut hanya boleh dijalankan saat tampilan jam aktif. Metode yang direkomendasikan untuk membuat aplikasi di ponsel mengetahui bahwa tampilan jam yang terkait sedang aktif adalah menggunakan CapabilityClient API.

Tentukan kemampuan yang ditambahkan secara dinamis dalam metode onCreate() dari WatchFaceService.Engine. Hapus kemampuan tersebut dengan metode onDestroy().

Misalnya, aplikasi yang mengambil data secara berkala untuk ditampilkan pada tampilan jam harus mendaftarkan pemroses untuk kemampuan yang diberitahukan oleh tampilan jam. Tambahkan alarm untuk mengambil data terbaru dan mengirimkannya ke tampilan jam saat jam tangan dapat dijangkau. Hapus alarm berkala jika tampilan jam tidak lagi dipilih atau jam tangan berada di luar jangkauan, dimatikan, atau tidak dapat menerima pembaruan.

Memantau pemakaian daya

Aplikasi pendamping Wear OS memungkinkan developer dan pengguna melihat banyaknya daya baterai yang dipakai oleh berbagai proses di perangkat wearable (di bagian Setelan > Baterai jam).

Untuk informasi tentang fitur yang diperkenalkan pada Android 5.0 yang membantu Anda meningkatkan masa pakai baterai, lihat Project Volta.

Mendaftarkan tampilan jam yang peka enkripsi

Android 7.0 dan yang lebih baru menyertakan dukungan untuk enkripsi berbasis file dan memungkinkan aplikasi peka enkripsi dijalankan sebelum pengguna memberikan kode sandi dekripsi saat booting. Hal ini dapat mengurangi durasi transisi dari animasi booting ke tampilan jam hingga 30 detik.

Untuk mengaktifkan booting yang lebih cepat, tambahkan android:directBootAware="true" ke manifes tampilan jam.

Catatan: Gunakan fitur ini dengan tampilan jam yang tidak menggunakan penyimpanan yang dienkripsi dengan kredensial.

Praktik terbaik untuk animasi

Praktik terbaik di bagian ini membantu mengurangi pemakaian daya oleh animasi.

Mengurangi frekuensi gambar animasi

Animasi sering memerlukan banyak komputasi dan memakai banyak daya. Sebagian besar animasi terlihat lancar pada 30 frame per detik, jadi sebaiknya Anda tidak menjalankan animasi dengan frekuensi gambar yang lebih tinggi. Anda dapat mengontrol frekuensi gambar saat invalidate() digunakan di akhir metode draw() dengan menambahkan penundaan sebelum memanggil metode invalidate(). Lihat cara menerapkan langkah ini dalam Menggambar tampilan jam.

Mengizinkan CPU tidur di antara animasi

Animasi dan perubahan kecil pada konten tampilan jam akan membangunkan CPU. Tampilan jam sebaiknya mengizinkan CPU untuk tidur di antara animasi. Misalnya, Anda dapat menggunakan beberapa animasi singkat setiap detik dalam mode interaktif lalu membiarkan CPU tidur hingga detik berikutnya. Membiarkan CPU sering tidur, meskipun sebentar, dapat mengurangi pemakaian daya secara signifikan.

Untuk memaksimalkan masa pakai baterai, gunakan animasi seperlunya. Bahkan titik dua yang berkedip akan membangunkan CPU pada setiap kedipannya dan dapat mengurangi masa pakai baterai.

Mengurangi ukuran aset bitmap

Banyak tampilan jam yang terdiri dari gambar latar dan aset visual lain yang diubah dan tumpang-tindih di atas gambar latar tersebut, seperti jarum jam dan elemen desain lainnya yang bergerak sepanjang waktu. Biasanya, elemen visual ini dirotasikan (dan terkadang diskalakan) di dalam metode Engine.onDraw() setiap kali sistem menggambar ulang tampilan jam, seperti yang dijelaskan dalam Menggambar Tampilan Jam.

Semakin besar aset visual Anda, semakin banyak komputasi yang diperlukan untuk mengubahnya. Mengubah aset visual yang besar dalam metode Engine.onDraw() akan secara signifikan mengurangi frekuensi gambar yang digunakan sistem untuk menjalankan animasi.

Gambar 1. Jarum jam dapat di-crop untuk menghapus piksel ekstra.

Untuk meningkatkan performa tampilan jam:

  • Jangan gunakan elemen visual yang lebih besar daripada kebutuhan Anda.
  • Hapus piksel transparan ekstra di sekitar tepi.

Contoh jarum jam di sisi kiri Gambar 1 dapat dikurangi ukurannya sebesar 97%.

Mengurangi ukuran aset bitmap seperti yang dijelaskan di bagian ini tidak hanya meningkatkan performa animasi, tetapi juga menghemat daya.

Menggabungkan aset bitmap

Jika Anda memiliki bitmap yang sering digambar bersama, pertimbangkan untuk menggabungkannya ke dalam aset visual yang sama. Sering kali Anda dapat menggabungkan gambar latar dalam mode interaktif dengan tanda centang, sehingga Anda tidak perlu menggambar dua bitmap layar penuh setiap kali sistem menggambar ulang tampilan jam.

Menonaktifkan anti-aliasing saat menggambar bitmap yang diskalakan

Saat menggambar bitmap yang diskalakan pada objek Canvas menggunakan metode Canvas.drawBitmap(), Anda dapat menyediakan instance Paint untuk mengonfigurasi beberapa opsi. Untuk meningkatkan performa, nonaktifkan anti-aliasing menggunakan metode setAntiAlias(), karena opsi ini tidak berpengaruh pada bitmap.

Gambar 2. Contoh pemfilteran bitmap dinonaktifkan (kiri) dan diaktifkan (kanan).

Menggunakan pemfilteran bitmap

Untuk aset bitmap yang Anda gambar di atas elemen lain, aktifkan pemfilteran bitmap pada instance Paint yang sama menggunakan metode setFilterBitmap(). Gambar 2 menunjukkan tampilan jarum jam yang diperbesar dengan dan tanpa pemfilteran bitmap.

Catatan: Dalam mode standby bit rendah, sistem tidak dapat merender warna dalam gambar dengan andal agar pemfilteran bitmap berhasil diproses. Saat mode standby aktif, nonaktifkan pemfilteran bitmap.

Memindahkan operasi besar di luar metode menggambar

Sistem akan memanggil metode Engine.onDraw() setiap kali menggambar ulang tampilan jam, jadi sebaiknya Anda hanya menyertakan operasi yang benar-benar diperlukan untuk memperbarui tampilan jam dalam metode ini guna meningkatkan performa.

Jika memungkinkan, hindari menjalankan operasi berikut dalam metode Engine.onDraw():

  • Memuat gambar dan resource lainnya.
  • Mengubah ukuran gambar.
  • Mengalokasikan objek.
  • Menjalankan komputasi yang hasilnya tidak berubah di antara frame.

Biasanya, Anda dapat menjalankan operasi ini dalam metode Engine.onCreate(). Anda dapat mengubah ukuran gambar terlebih dulu dalam metode Engine.onSurfaceChanged(), yang memberi Anda ukuran kanvas.

Untuk menganalisis performa tampilan jam, gunakan CPU Profiler. Secara khusus, pastikan waktu eksekusi untuk implementasi Engine.onDraw() Anda tidak terlalu lama dan konsisten di seluruh pemanggilan. Untuk informasi selengkapnya, lihat Merekam dan memeriksa pelacakan metode.