Update yang dilakukan pada area khusus tampilan ini disediakan di halaman ini.
Dekorasi sistem
Android 10 menambahkan dukungan untuk mengonfigurasi tampilan sekunder agar menampilkan dekorasi sistem tertentu, seperti wallpaper, menu navigasi, dan peluncur. Secara default, tampilan utama menampilkan semua dekorasi sistem, dan tampilan sekunder menampilkan dekorasi yang diaktifkan secara opsional. Anda dapat menetapkan dukungan untuk editor metode input (IME) secara terpisah dari dekorasi sistem lainnya.
Gunakan DisplayWindowSettings#setShouldShowSystemDecorsLocked untuk menambahkan dukungan bagi dekorasi sistem pada tampilan tertentu atau memberikan nilai default di /data/system/display_settings.xml. Untuk contohnya,
lihat Setelan jendela tampilan.
Penerapan
DisplayWindowSettings#setShouldShowSystemDecorsLocked juga diekspos di WindowManager#setShouldShowSystemDecors untuk pengujian. Memicu metode ini dengan intent untuk mengaktifkan dekorasi sistem tidak akan menambahkan jendela dekorasi yang sebelumnya tidak ada, atau menghapusnya jika sebelumnya ada. Dalam sebagian besar kasus, perubahan dukungan dekorasi sistem akan berlaku sepenuhnya hanya setelah perangkat di-reboot.
Pemeriksaan dukungan dekorasi sistem dalam basis kode WindowManager biasanya dilakukan melalui DisplayContent#supportsSystemDecorations, sedangkan pemeriksaan untuk layanan eksternal (seperti UI Sistem untuk memeriksa apakah menu navigasi harus ditampilkan) menggunakan WindowManager#shouldShowSystemDecors.
Untuk memahami apa yang dikontrol oleh setelan ini, pelajari titik panggilan metode ini.
Jendela dekorasi UI sistem
Android 10 hanya menambahkan dukungan jendela dekorasi sistem untuk menu navigasi karena menu navigasi penting untuk menavigasi antar-aktivitas dan aplikasi. Secara default, menu navigasi menampilkan fitur Kembali dan Beranda. Menu navigasi hanya disertakan jika tampilan target mendukung dekorasi sistem (lihat DisplayWindowSettings).
Status bar adalah jendela sistem yang lebih rumit, karena juga berisi Menu Notifikasi, Setelan Cepat, dan Layar Kunci. Di Android 10, status bar tidak didukung di tampilan sekunder. Oleh karena itu, notifikasi, setelan, dan keyguard lengkap hanya tersedia di tampilan utama.
Jendela sistem Ringkasan atau Terbaru tidak didukung di layar sekunder. Di Android 10, AOSP hanya menampilkan Terbaru di tampilan default dan berisi aktivitas dari semua tampilan. Saat diluncurkan dari Terbaru, aktivitas yang ada di tampilan sekunder akan ditampilkan di bagian depan pada tampilan tersebut, secara default. Pendekatan ini memiliki beberapa masalah umum, seperti tidak langsung diperbarui saat aplikasi muncul di layar lain.
Penerapan
Untuk menerapkan fitur UI Sistem tambahan, produsen perangkat harus menggunakan satu komponen UI Sistem yang memproses penambahan atau penghapusan tampilan dan menyajikan konten yang sesuai.
Komponen UI Sistem yang mendukung Multi-Tampilan (MD) harus menangani kasus berikut:
- Inisialisasi beberapa tampilan saat startup
- Tampilan ditambahkan saat runtime
- Tampilan dihapus saat runtime
Jika UI Sistem mendeteksi penambahan tampilan sebelum WindowManager, UI Sistem akan membuat kondisi race. Anda dapat menghindarinya dengan menerapkan callback kustom dari WindowManager ke UI Sistem saat tampilan ditambahkan, bukan dengan berlangganan ke peristiwa DisplayManager.DisplayListener. Untuk implementasi referensi, lihat CommandQueue.Callbacks#onDisplayAddSystemDecorations untuk dukungan menu navigasi dan WallpaperManagerInternal#onDisplayAddSystemDecorations untuk wallpaper.
Selain itu, Android 10 menyediakan update berikut:
- Class
NavigationBarControllermengontrol semua fungsi khusus untuk menu navigasi. - Untuk melihat menu navigasi yang disesuaikan, lihat
CarStatusBar. TYPE_NAVIGATION_BARtidak lagi dibatasi untuk satu instance dan dapat digunakan per tampilan.IWindowManager#hasNavigationBardiperbarui untuk menyertakan parameterdisplayIdhanya untuk UI Sistem.
Peluncur
Di Android 10, setiap tampilan yang dikonfigurasi untuk mendukung dekorasi sistem memiliki tumpukan beranda khusus untuk aktivitas peluncur dengan jenis WindowConfiguration#ACTIVITY_TYPE_HOME, secara default. Setiap tampilan menggunakan instance aktivitas peluncur yang terpisah:


Gambar 1. Contoh peluncur multi-tampilan untuk platform/development/samples/MultiDisplay.
Sebagian besar peluncur yang ada tidak mendukung beberapa instance dan tidak dioptimalkan untuk ukuran layar besar. Selain itu, jenis pengalaman yang berbeda sering kali diharapkan pada tampilan sekunder/eksternal. Untuk menyediakan aktivitas khusus bagi layar sekunder, Android 10 memperkenalkan kategori SECONDARY_HOME dalam filter intent. Instance aktivitas ini digunakan pada semua tampilan yang mendukung dekorasi sistem, satu instance untuk setiap tampilan.
<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 diharapkan dapat menyesuaikan dengan berbagai ukuran layar. Mode peluncuran tidak boleh singleInstance atau singleTask.
Penerapan
Di Android 10, RootActivityContainer#startHomeOnDisplay secara otomatis memilih komponen dan intent yang diinginkan, bergantung pada tampilan tempat layar utama diluncurkan. RootActivityContainer#resolveSecondaryHomeActivity
berisi logika untuk mencari komponen aktivitas peluncur, bergantung pada peluncur yang saat ini dipilih, dan dapat menggunakan default sistem, jika diperlukan (lihat ActivityTaskManagerService#getSecondaryHomeIntent).
Batasan keamanan
Selain batasan yang berlaku untuk aktivitas di tampilan sekunder, untuk menghindari kemungkinan aplikasi berbahaya membuat tampilan virtual dengan dekorasi Sistem yang diaktifkan dan membaca informasi sensitif pengguna dari platform, peluncur hanya muncul di tampilan virtual yang dimiliki oleh sistem. Peluncur tidak menampilkan konten di tampilan virtual non-sistem.
Wallpaper
Di Android 10 dan yang lebih tinggi, wallpaper didukung di tampilan sekunder:


Gambar 2. Wallpaper animasi di tampilan internal (atas) dan eksternal (bawah).
Developer dapat mendeklarasikan dukungan untuk fitur wallpaper dengan memberikan android:supportsMultipleDisplays="true" dalam definisi XML WallpaperInfo. Developer wallpaper juga diharapkan memuat aset menggunakan konteks tampilan di WallpaperService.Engine#getDisplayContext.
Framework membuat satu instance WallpaperService.Engine per tampilan, sehingga setiap engine memiliki konteks platform dan tampilannya sendiri. Developer harus memastikan bahwa setiap engine dapat digambar secara independen, pada kecepatan frame yang berbeda, dengan memperhatikan VSync.
Memilih wallpaper untuk setiap layar
Android 10 tidak memberikan dukungan platform langsung untuk memilih wallpaper untuk setiap layar. Untuk melakukannya, ID tampilan yang stabil diperlukan untuk mempertahankan setelan wallpaper per tampilan.
Display#getDisplayId bersifat dinamis, sehingga tidak ada jaminan bahwa tampilan fisik akan memiliki ID yang sama setelah di-reboot.
Namun, Android 10 menambahkan DisplayInfo.mAddress, yang berisi ID stabil untuk tampilan fisik dan dapat digunakan untuk implementasi lengkap di masa mendatang. Sayangnya, sudah terlambat untuk menerapkan logika untuk Android 10. Solusi yang disarankan:
- Gunakan class
WallpaperManageruntuk menetapkan wallpaper.WallpaperManagerdiperoleh dari objekContext, dan setiap objekContextmemiliki informasi tentang tampilan yang sesuai (Context#getDisplay/getDisplayId). Oleh karena itu, Anda dapat memperolehdisplayIddari instanceWallpaperManagertanpa menambahkan metode baru. - Di sisi framework, gunakan
displayIdyang diperoleh dari objekContextdan petakan ke ID statis (seperti port tampilan fisik). Gunakan ID statis untuk mempertahankan wallpaper yang dipilih.
Solusi sementara ini menggunakan implementasi yang ada untuk pemilih wallpaper. Jika dibuka di tampilan tertentu dan menggunakan konteks yang tepat, saat memanggil untuk menetapkan wallpaper, sistem dapat otomatis mengidentifikasi tampilan.
Jika perlu menetapkan wallpaper untuk tampilan selain tampilan saat ini
tampilan, buat objek Context baru untuk tampilan target
(Context#createDisplayContext) dan dapatkan instance
WallpaperManager dari tampilan tersebut.
Batasan keamanan
Sistem tidak akan menampilkan wallpaper di tampilan virtual yang tidak dimilikinya. Hal ini disebabkan oleh masalah keamanan bahwa aplikasi berbahaya dapat membuat tampilan virtual dengan dukungan dekorasi sistem yang diaktifkan dan membaca informasi sensitif pengguna dari platform (seperti foto pribadi).
Penerapan
Di Android 10, antarmuka IWallpaperConnection#attachEngine dan IWallpaperService#attach menerima parameter displayId untuk membuat koneksi per tampilan.
WallpaperManagerService.DisplayConnector mengenkapsulasi engine dan koneksi wallpaper per tampilan. Di WindowManager, pengendali wallpaper dibuat untuk setiap objek DisplayContent saat konstruksi, bukan satu WallpaperController untuk semua tampilan.
Beberapa implementasi metode WallpaperManager publik (seperti
WallpaperManager#getDesiredMinimumWidth) diperbarui untuk menghitung
dan memberikan informasi untuk tampilan yang sesuai.
WallpaperInfo#supportsMultipleDisplays dan atribut resource yang sesuai ditambahkan, sehingga developer aplikasi dapat melaporkan wallpaper mana yang siap untuk beberapa layar.
Jika layanan wallpaper yang ditampilkan di tampilan default tidak mendukung beberapa tampilan, sistem akan menampilkan wallpaper default di tampilan sekunder:

Gambar 3. Logika penggantian wallpaper untuk tampilan sekunder.
Mengaktifkan dukungan wallpaper animasi
Di Android 10 dan yang lebih tinggi (API 29), developer dapat menggunakan atribut android:supportsMultipleDisplays
untuk menunjukkan apakah wallpaper mereka dapat menjangkau berbagai tampilan. Di lingkungan jendela desktop, tempat multitasking padat, rendering wallpaper animasi di tampilan eksternal dapat memengaruhi GPU dan overhead memori secara signifikan.
Untuk mempertahankan resource sistem, sistem tidak merender wallpaper animasi di tampilan yang terhubung secara default. Jika wallpaper animasi dibatasi oleh konfigurasi sistem atau manifes aplikasi, sistem akan merender wallpaper statis pengganti.
OEM dapat menyesuaikan pengalaman ini dengan mengaktifkan dukungan wallpaper animasi untuk hardware kelas atas atau menyesuaikan penggantian statis untuk tampilan bermerek.
Jika hardware Anda dapat merender beberapa instance wallpaper animasi, ganti konfigurasi berikut:
| Jalur Resource | frameworks/base/core/res/res/values/config.xml |
|---|---|
| Nama Konfigurasi | config_isLiveWallpaperSupportedInDesktopExperience |
Menyesuaikan wallpaper pengganti
Jika wallpaper animasi dinonaktifkan atau tidak didukung oleh penyedia, sistem akan menggunakan komponen default. Anda dapat mengarahkannya ke penyedia wallpaper statis Anda sendiri:
| Jalur Resource | frameworks/base/core/res/res/values/config.xml |
|---|---|
| Nama Konfigurasi | fallback_wallpaper_component |
Menerapkan dukungan wallpaper
Untuk menerapkan perubahan ini, gunakan overlay resource waktu build di folder khusus perangkat Anda, yang
biasanya device/<vendor>/<product>/overlay/frameworks/base/core/res/res/values/.