Buat aplikasi untuk foldable

Android 10 (level API 29) menambahkan lebih banyak dukungan untuk perangkat foldable dan berbagai pola foldable.

Membuka perangkat untuk menyediakan layar yang lebih besar dapat berdampak positif bagi pengguna:

  • Layar yang lebih besar biasanya berarti pengalaman yang lebih imersif.
  • Dengan multi-aplikasi, pengguna dapat melakukan beberapa tugas sekaligus.

Melipat dan membuka dapat mengubah ukuran layar, kepadatan, atau rasio. Ini bukan masalah baru dalam pengembangan Android. Ini sudah terjadi dalam kasus non-lipat ini:

  • Telepon: beralih antara mode potret dan lanskap.
  • Chrome OS yang berjalan dalam mode desktop: mengubah ukuran aplikasi Android.
  • Perangkat dengan beberapa layar atau tambahan.

Halaman ini menjelaskan praktik terbaik untuk memastikan aplikasi Anda berfungsi dengan baik dengan faktor bentuk foldable.

Anda mungkin juga ingin membaca ringkasan Android 10 mengenai perubahan yang melibatkan dukungan foldable.

Kontinuitas aplikasi

Saat berjalan pada perangkat foldable, aplikasi dapat beralih dari satu layar ke layar lainnya secara otomatis. Untuk memberikan pengalaman pengguna yang hebat, tugas saat ini terus harus berjalan lancar setelah transisi. Aplikasi harus dilanjutkan dalam status dan lokasi yang sama. Perhatikan bahwa perangkat foldable dapat dilipat dengan berbagai cara, seperti masuk atau keluar:

Karena sistem akan memicu perubahan konfigurasi selama transisi, aplikasi harus menyimpan status UI dan mendukung perubahan konfigurasi dengan baik.

Buat aplikasi Anda bisa diubah ukurannya

Anda harus memastikan bahwa aplikasi Anda bekerja dalam mode multi-aplikasi dan dengan pengubahan ukuran dinamis. Lakukan ini dengan menyetel resizeableActivity=true. Hal ini memberikan kompatibilitas maksimum dengan faktor bentuk dan lingkungan apa pun yang mungkin ditemui aplikasi Anda (seperti foldable, mode desktop, atau jendela bentuk bebas). Uji perilaku aplikasi Anda di layar terbagi atau dengan Emulator foldable.

Jika aplikasi Anda menyetel resizeableActivity=false, ini memberi tahu platform bahwa aplikasi tersebut tidak mendukung multi-aplikasi. Sistem dapat tetap mengubah ukuran aplikasi Anda atau menempatkannya dalam mode multi-aplikasi, tetapi kompatibilitas diterapkan dengan menerapkan konfigurasi yang sama untuk semua komponen dalam aplikasi (termasuk semua Aktivitas, Layanan, dan sebagainya). Dalam beberapa kasus, perubahan besar (seperti perubahan ukuran tampilan) dapat memulai ulang proses, bukan mengubah konfigurasi.

Misalnya, aktivitas di bawah ini telah menyetel resizableActivity=false bersama dengan maxAspectRatio. Saat perangkat dibuka, konfigurasi aktivitas, ukuran, dan rasio aspek dipelihara dengan menempatkan aplikasi dalam mode kompatibilitas.

Jika Anda tidak menyetel resizeableActivity, atau menyetelnya ke true, sistem menganggap aplikasi sepenuhnya mendukung multi-aplikasi dan dapat diubah ukurannya.

Perhatikan bahwa beberapa OEM mungkin menerapkan fitur yang menambahkan ikon restart kecil di layar setiap kali area tampilan aktivitas berubah. Ini memberi pengguna kesempatan untuk memulai ulang aktivitas dalam konfigurasi baru.

Rasio layar baru

Android 10 (level API 29) dan yang lebih tinggi mendukung rentang rasio aspek yang lebih luas. Dengan Foldables, faktor bentuk dapat bervariasi dari layar yang sangat tinggi dan tipis (seperti 21:9 untuk perangkat yang dilipat) hingga ke 1:1.

Agar kompatibel dengan sebanyak mungkin perangkat, Anda harus menguji aplikasi rasio layar ini sebanyak mungkin:

Jika Anda tidak dapat mendukung beberapa rasio tersebut, Anda dapat menggunakan maxAspectRatio (seperti sebelumnya), serta minAspectRatio untuk menunjukkan rasio tertinggi dan terendah yang dapat ditangani oleh aplikasi Anda. Dalam kasus dengan layar yang melebihi batas ini, aplikasi Anda mungkin dimasukkan ke dalam mode kompatibilitas.

Ketika ada lima ikon di tampilan navigasi bawah, perangkat yang menjalankan Android 10 (level API 29) dan yang lebih tinggi dijamin ukuran target sentuh minimum sebesar 2 inci. Lihat Dokumen Definisi Kompatibilitas.

Multi-aplikasi:

Mampu menjalankan beberapa jendela adalah salah satu manfaat layar besar. Di masa lalu, memiliki dua aplikasi berdampingan adalah hal biasa di beberapa perangkat. Teknologi ini telah meningkat ke titik saat tiga aplikasi atau lebih dapat berjalan di layar secara bersamaan, dan juga berbagi konten di antara mereka sendiri:

Jika suatu aplikasi tidak mendukung multi-aplikasi dengan baik, aplikasi tersebut dapat menyetel resizeableActivity=false. Untuk informasi selengkapnya, baca Panduan Multi-Aplikasi.

Dengan multi-aplikasi menjadi lebih umum, pertimbangkan untuk mendukung tarik dan lepas di aplikasi Anda.

Multi-resume

Saat berjalan di Android 9.0 dan yang lebih lama, hanya aplikasi yang sedang mendapatkan fokus dalam status dilanjutkan. Aktivitas lain yang terlihat dijeda. Ini dapat menyebabkan masalah jika aplikasi menutup sumber daya atau berhenti memutar konten ketika mereka berhenti.

Dalam Android 10, perilaku ini berubah sehingga semua Aktivitas tetap dalam status dilanjutkan bila perangkat dalam mode multi-aplikasi. Ini disebut multi-resume. Perhatikan bahwa suatu aktivitas dapat dijeda jika ada aktivitas transparan di atas, atau Aktivitas tidak dapat fokus (mis. mode picture-in-picture). Mungkin juga bahwa tidak ada aktivitas yang memiliki fokus pada waktu tertentu, misalnya, jika panel samping Notifikasi dibuka. OnStop terus bekerja seperti biasa. Ini akan dipanggil kapan pun aktivitas dihapus dari layar.

Multi-resume juga tersedia di perangkat tertentu yang menjalankan Android 9.0. Untuk memilih untuk multi-resume pada perangkat tersebut, Anda dapat menambahkan meta-data manifes berikut:

<meta-data
    android:name="android.allow_multiple_resumed_activities" android:value="true" />

Untuk memverifikasi bahwa perangkat yang diberikan mendukung meta-data manifes ini, lihat spesifikasi perangkat.

Akses sumber daya eksklusif

Untuk membantu mendukung fitur multi-resume, ada callback siklus hidup baru, Activity#onTopResumedActivityChanged().

Metode ini dipanggil bila suatu aktivitas memperoleh atau kehilangan posisi teratas Aktivitas yang dilanjutkan. Ini penting untuk diketahui saat suatu aktivitas menggunakan sumber daya pengguna tunggal bersama, seperti mikrofon atau kamera.

protected void onTopResumedActivityChanged(boolean topResumed) {
    if (topResumed) {
        // Top resumed activity
        // Can be a signal to re-acquire exclusive resources
    } else {
        // No longer the top resumed activity
    }
}

Perhatikan bahwa aplikasi dapat kehilangan sumber daya karena beberapa alasan lain, seperti melepas hardware bersama.

Dalam kasus apa pun, aplikasi harus menangani peristiwa kehilangan sumber daya dengan baik dan perubahan status yang memengaruhi sumber daya yang tersedia.

Untuk aplikasi yang menggunakan kamera, disarankan untuk menggunakan metode CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() sebagai petunjuk bahwa ini mungkin saat yang tepat untuk mencoba mendapatkan akses ke kamera. Metode ini tersedia dalam Android 10 (level API 29) dan yang lebih tinggi.

Ingat bahwa resizeableActivity=false bukan jaminan akses kamera eksklusif, karena aplikasi lain yang menggunakan kamera dapat dibuka di layar lain.

Kamera dalam mode multi-aplikasi.

Aplikasi Anda tidak harus melepaskan kamera saat kehilangan fokus. Misalnya, Anda mungkin ingin melanjutkan pratinjau kamera saat pengguna berinteraksi dengan aplikasi yang dilanjutkan paling atas dan baru fokus. Aplikasi Anda tidak perlu terus menjalankan kamera bila itu bukan aplikasi yang dilanjutkan tetapi harus menangani kasus pemutusan dengan baik. Ketika aplikasi yang dilanjutkan paling atas ingin menggunakan kamera, aplikasi tersebut dapat membukanya, dan aplikasi Anda akan kehilangan akses. Aplikasi Anda dapat membuka ulang kamera saat mendapatkan fokus kembali.

Setelah aplikasi menerima callback CameraDevice.StateCallback#onDisconnected(), panggilan selanjutnya pada perangkat kamera akan melontarkan CameraAccessException.

Multi-tampilan

Di masa mendatang, Anda mungkin melihat ponsel foldable yang mendukung lebih dari satu layar atau tampilan sekaligus. Menangani konfigurasi ini mirip dengan cara kerja developer sekarang dengan layar yang diproyeksikan di Chrome OS.

Android 10 (level API 29) dan yang lebih tinggi mendukung aktivitas pada tampilan sekunder. Jika suatu aktivitas berjalan pada perangkat dengan beberapa tampilan, pengguna dapat memindahkan aktivitas dari satu tampilan ke tampilan lainnya. Multi-resume juga berlaku untuk skenario multilayar. Beberapa aktivitas dapat menerima input pengguna secara bersamaan.

Aplikasi dapat menentukan tampilan mana yang harus dijalankan saat diluncurkan, atau saat membuat aktivitas lain. Perilaku ini bergantung pada mode peluncuran aktivitas yang ditentukan dalam file manifes, serta pada flag intent dan opsi yang ditetapkan oleh entitas yang meluncurkan aktivitas. Lihat ActivityOptions untuk detail lebih lanjut.

Seperti halnya transisi lipat, bila suatu aktivitas bergerak ke tampilan sekunder, aktivitas tersebut dapat menjalani update konteks, pengubahan ukuran jendela, dan perubahan konfigurasi dan sumber daya. Jika aktivitas menangani perubahan konfigurasi, itu akan diberitahukan dalam onConfigurationChanged(). Jika tidak, aktivitas akan diluncurkan kembali.

Suatu aktivitas harus memeriksa tampilan saat ini di onCreate dan onConfigurationChanged jika ditangani. Pastikan untuk memperbarui sumber daya dan tata letak saat tampilan berubah.

Jika mode peluncuran yang dipilih untuk suatu aktivitas memungkinkan beberapa instance, ingatlah bahwa peluncuran pada layar sekunder dapat membuat instance aktivitas baru. Kedua aktivitas akan dilanjutkan secara bersamaan.

Beberapa instance Aktivitas dalam beberapa tampilan.

Anda mungkin juga ingin membaca tentang API multi-tampilan yang ada, yang diperkenalkan di Android 8.0.

Cutout tampilan

Perangkat foldable mungkin memiliki geometri potongan yang berbeda saat dilipat dan dibuka. Untuk menghindari masalah potongan, baca Praktik terbaik untuk potongan layar.

Konteks aplikasi vs aktivitas

Menggunakan konteks yang tepat sangat penting dalam multi-tampilan. Saat mengakses sumber daya, konteks aktivitas (yang ditampilkan) berbeda dari konteks aplikasi (yang tidak ditampilkan).

Konteks aktivitas berisi informasi tentang tampilan dan selalu disesuaikan untuk area tampilan tempat tampilan itu muncul. Untuk mendapatkan metrik tampilan dan sumber daya saat ini, gunakan konteks aktivitas. Ini juga mempengaruhi beberapa API sistem yang menggunakan informasi dari konteks (seperti Toast).

Konfigurasi jendela aktivitas dan tampilan induk menentukan sumber daya dan konteks. Untuk mendapatkan tampilan saat ini, gunakan:

val activityDisplay = activity.windowManager.defaultDisplay

Untuk mendapatkan metrik jendela aktivitas saat ini, gunakan:

val windowMetrics = DisplayMetrics()
activityDisplay.getMetrics(windowMetrics)

atau:

val windowMetrics = activity.resources.displayMetrics

Menggunakan layar sekunder

Anda bisa mendapatkan tampilan yang tersedia dari layanan sistem DisplayManager:

val dm = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = dm.displays

Gunakan class Display untuk mendapatkan informasi tentang tampilan tertentu:

  • Metrik tampilan memberi Anda informasi tentang ukuran, resolusi, dan kepadatan layar.
  • Periksa flag untuk melihat apakah tampilan aman.

Untuk menentukan apakah suatu aktivitas dapat diluncurkan pada tampilan:

activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)

Dan untuk meluncurkan aktivitas pada tampilan:

val options = ActivityOptions.makeBasic()
options.launchDisplayId = targetDisplay.displayId
startActivity(intent, options.toBundle())

Dukungan multi-tampilan

Android sudah mendukung Wallpaper, Peluncur, dan keyboard Software.

Keyboard software

Keyboard dapat ditampilkan di layar sekunder jika layar dikonfigurasikan untuk mendukung dekorasi sistem. Editor metode input akan secara otomatis muncul jika kolom teks meminta input pada tampilan tersebut.

Keyboard di tampilan sekunder.

Wallpaper

Dalam Android 10 (level API 29) dan yang lebih tinggi, layar sekunder bisa memiliki wallpaper. Framework membuat instance terpisah dari WallpaperService.Engine untuk setiap tampilan. Pastikan permukaan setiap mesin ditarik secara independen. Developer dapat memuat aset menggunakan konteks tampilan di WallpaperService.Engine#getDisplayContext(). Selain itu, pastikan file WallpaperInfo.xml Anda menyetel android:supportsMultipleDisplays="true".

Wallpaper di ponsel dan tampilan sekunder.

Peluncur

Ada kategori filter intent baru SECONDARY_HOME untuk menyediakan aktivitas khusus untuk layar sekunder. Instance aktivitas ini digunakan pada semua layar yang mendukung dekorasi sistem, satu instance untuk setiap layar.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

Aktivitas harus memiliki mode peluncuran yang tidak mencegah beberapa instance dan dapat beradaptasi dengan berbagai ukuran layar. Mode peluncuran tidak boleh singleInstance atau singleTask.

Sebagai contoh, implementasi AOSP dari Launcher3 mendukung aktivitas SECONDARY_HOME.

Peluncur Desain Material di ponsel.

Peluncur Desain Material di tampilan sekunder.

Pengujian

Agar aplikasi Anda siap untuk Foldable, Anda harus menguji reaksi aplikasi Anda terhadap:

  • Perubahan konfigurasi
  • Multi-aplikasi dan multi-resume
  • Pengubahan ukuran dan rasio layar baru

Emulator foldable

Emulator AOSP mendukung perangkat lipat. Ini memungkinkan developer menguji aplikasi mereka dalam skenario lipat.

7.3’’ emulator foldable

7.3 " Tampilan Resolusi Tampilan Logis
Ukuran X Y densityDpi Ukuran
Dibuka 7.3 1536 2152 420 besar
Dilipat 4.6 840 1960 420 normal

8’’ emulator foldable

8" Tampilan Resolusi Tampilan Logis
Ukuran X Y densityDpi Ukuran
Dibuka 8.03 2200 2480 420 besar
Dilipat 6.62 1148 2480 420 normal

Emulator lipat AOSP.

Menguji multi-tampilan

Opsi Dev baru yang disebut mode Desktop paksa memungkinkan developer mengaktifkan dukungan dekorasi sistem di semua tampilan sekunder dan menampilkan pointer mouse di sana, bukan di tampilan default. Saat digunakan dengan Aktifkan jendela Bentuk Bebas, Desktop paksa mensimulasikan pengalaman desktop dengan multi-aplikasi dan kemampuan untuk mengubah ukuran jendela.

Di Pixel, Anda dapat mencobanya menggunakan Simulasi tampilan. Atau, jika Anda memiliki perangkat yang mendukung HDMI atau displayport-over-USB-C, Anda dapat mengujinya menggunakan koneksi kabel.

Simulasi tampilan.