Halaman ini menyajikan rekomendasi untuk menggunakan beberapa layar.
Aplikasi untuk perangkat foldable dan multi-layar
Umumnya, aplikasi tidak boleh mengandalkan ID statis atau logika yang bergantung pada beberapa ID layar. Dalam sebagian besar kasus, aplikasi harus mengubah ukuran dan berfungsi di layar yang berbeda, dan sistem harus mengontrol lokasi aplikasi. Misalnya, untuk membuat pengalaman baru dan unik untuk perangkat foldable dan meluncurkan aplikasi khusus di layar eksternal saat perangkat dilipat.
Dalam hal ini, UI Sistem atau komponen sistem lainnya harus mendeteksi lipatan, menentukan apakah tindakan tersebut sesuai untuk dilakukan, lalu meluncurkan aktivitas target dan menentukan ID layar eksternal sebagai target peluncuran. Aplikasi tidak boleh mendeteksi tindakan ini atau melakukan tindakan apa pun sebagai respons, lalu melakukan peluncuran di layar tertentu. Jadi, jangan berasumsi bahwa hal yang berfungsi di satu perangkat akan berfungsi di perangkat lain. Singkatnya, kode khusus perangkat meningkatkan fragmentasi.
Membatasi akses ke layar
Jika konfigurasi perangkat memerlukan pembatasan akses ke satu atau beberapa layar, sebaiknya gunakan flag Display#FLAG_PRIVATE untuk menetapkan layar sebagai pribadi. Penetapan ini membatasi semua orang kecuali pemilik untuk menambahkan konten ke layar. Jika siapa pun selain pemilik mencoba meluncurkan aktivitas atau menambahkan jendela, tindakan ini akan memicu SecurityException.
Jika sistem memiliki layar, sistem dapat menambahkan jendela dan meluncurkan aktivitas.
Selain itu, entity yang ditempatkan di layar selalu dapat mengakses layar tersebut. Jika pemilik meluncurkan aktivitas di layar, aktivitas tersebut dapat meluncurkan aktivitas lain di layar ini. Oleh karena itu, pemilik bertanggung jawab untuk membatasi akses dan hanya mengizinkan aplikasi tepercaya.
Selain itu, lebih banyak batasan ditambahkan ke layar virtual karena aplikasi apa pun dapat membuatnya tanpa membuatnya terlihat oleh pengguna. Jika layar virtual tidak dimiliki oleh sistem, hanya aktivitas dengan allowEmbedded yang diizinkan dan pemanggil harus memiliki izin ACTIVITY_EMBEDDING.
Untuk mengetahui informasi selengkapnya, lihat:
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplayActivityDisplay#isUidPresentDisplayManagerService#isUidPresentOnDisplay
Untuk mengontrol peluncuran aktivitas secara kondisional, gunakan LaunchParamsController, yang mencegat semua peluncuran aktivitas dan memungkinkan komponen sistem mengubah parameter yang digunakan untuk peluncuran. Hal ini tersedia di system_server.
Mengonfigurasi setelan jendela layar dan dekorasi sistem
Dekorasi sistem dapat
dikonfigurasi per layar di DisplayWindowSettings. Implementasi perangkat dapat memberikan konfigurasi default di /data/system/display_settings.xml.
Nilai ini menentukan apakah dekorasi sistem (peluncur, wallpaper, panel navigasi, dan jendela dekorasi lainnya) serta IME muncul di layar.
Untuk mengetahui detailnya, lihat DisplayWindowSettings#shouldShowSystemDecorsLocked dan DisplayWindowSettings#shouldShowImeLocked.
Untuk mengidentifikasi layar, gunakan ID unik (default ini menggunakan DisplayInfo#uniqueId) atau ID port fisik untuk layar hardware (lihat DisplayInfo#address).
Misalnya, contoh konfigurasi layar berikut mengaktifkan dekorasi sistem dan IME di layar simulasi:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
Pada contoh di atas, uniqueId digunakan untuk identifikasi layar dalam atribut nama, yang untuk layar simulasi adalah overlay:1.
Untuk layar bawaan, nilai contohnya mungkin "local:45354385242535243453".
Opsi lainnya adalah menggunakan informasi port hardware dan menetapkan identifier="1"
agar sesuai dengan DisplayWindowSettings#IDENTIFIER_PORT, lalu memperbarui
nama untuk menggunakan format "port:<port_id>":
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
Untuk mengetahui detailnya, lihat ID layar statis.
Untuk mengetahui informasi selengkapnya, lihat:
Mengalihkan layar antara tugas mirroring dan hosting
Di Android 17 dan yang lebih tinggi, DisplayManager menggunakan flag
FLAG_ALLOWS_CONTENT_MODE_SWITCH untuk mengontrol apakah layar beralih
antara tugas mirroring dan hosting tugas saat runtime. Secara default, flag ini diaktifkan untuk layar eksternal dan dinonaktifkan untuk semua layar lainnya.
Jika FLAG_ALLOWS_CONTENT_MODE_SWITCH ada, DisplayManager akan memantau setelan aman android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY untuk menentukan apakah akan melakukan mirroring atau hosting tugas. Meskipun ini adalah logika default, OEM dapat menyesuaikan perilaku ini.
Topologi layar dan gerakan pointer
Di Android 17 dan yang lebih tinggi, topologi layar menentukan posisi relatif layar dan membatasi gerakan kursor mouse ke kumpulan layar tertentu dalam topologi.
WindowManager memutuskan untuk menyertakan layar dalam topologi dan memanggil DisplayManagerInternal.onDisplayBelongToTopologyChanged. DisplayManager
memeriksa DisplayTopologyCoordinator.isDisplayAllowedInTopology sebelum menambahkan layar. Secara default, jika layar lokal dapat menghosting tugas, sistem akan menambahkannya.
Jika ada beberapa layar publik yang dapat menghosting tugas, keputusan untuk menyertakan layar default ditangani oleh penyedia boolean shouldIncludeDefaultDisplayInTopology yang diteruskan ke DisplayTopologyCoordinator. Jika layar default adalah satu-satunya layar publik yang dapat menghosting tugas, layar tersebut akan selalu berada dalam topologi. Di AOSP, penyedia boolean hanya menampilkan true jika layar default mendukung mode jendela desktop atau jika setelan aman Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY adalah true.
Aplikasi membuat kueri topologi saat ini menggunakan DisplayManager.getDisplayTopology dan bereaksi terhadap perubahan topologi dengan mendaftarkan pemroses dengan DisplayManager.registerTopologyListener.