Pembaruan 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, panel navigasi, dan peluncur. Secara default, layar utama menampilkan semua dekorasi sistem, dan layar sekunder menampilkan dekorasi yang diaktifkan secara opsional. Anda dapat menyetel dukungan untuk editor metode input (IME) secara terpisah dari dekorasi sistem lainnya.
Gunakan DisplayWindowSettings#setShouldShowSystemDecorsLocked()
untuk menambahkan dukungan untuk dekorasi sistem pada layar tertentu atau memberikan
nilai default di /data/system/display_settings.xml
. Untuk contohnya,
lihat Setelan jendela tampilan.
Implementasi
DisplayWindowSettings#setShouldShowSystemDecorsLocked()
juga ditampilkan di
WindowManager#setShouldShowSystemDecors()
untuk pengujian. Memicu metode ini
dengan maksud 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 hanya akan diterapkan sepenuhnya setelah perangkat dimulai ulang.
Pemeriksaan dukungan dekorasi sistem di basis kode WindowManager biasanya dilakukan melalui DisplayContent#supportsSystemDecorations()
, sedangkan pemeriksaan layanan eksternal (seperti UI Sistem untuk memeriksa apakah panel navigasi harus ditampilkan) menggunakan WindowManager#shouldShowSystemDecors()
.
Untuk memahami apa yang dikontrol oleh setelan ini, pelajari titik panggilan dari metode ini.
Jendela dekorasi UI sistem
Android 10 menambahkan dukungan jendela dekorasi sistem
untuk hanya menu navigasi, karena menu navigasi penting
untuk bernavigasi antar-aktivitas dan aplikasi. Secara default, menu navigasi menampilkan
afordans Kembali dan Beranda. Ini 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 pada tampilan sekunder. Oleh karena itu, notifikasi, setelan, dan keyguard penuh hanya tersedia di layar utama.
Jendela sistem Ringkasan/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 berada di tampilan sekunder akan ditampilkan di latar depan pada tampilan tersebut secara default. Pendekatan ini memiliki beberapa masalah umum, seperti tidak langsung diperbarui saat aplikasi muncul di layar lain.
Implementasi
Untuk menerapkan fitur UI Sistem tambahan, produsen perangkat harus menggunakan satu komponen UI Sistem yang memantau penambahan atau penghapusan layar dan menampilkan konten yang sesuai.
Komponen UI Sistem yang mendukung Multi-Tampilan (MD) harus menangani kasus berikut:
- Inisialisasi beberapa layar saat startup
- Tampilan ditambahkan saat runtime
- Tampilan dihapus saat runtime
Saat UI Sistem mendeteksi penambahan layar sebelum WindowManager, kondisi persaingan akan terjadi. Anda dapat menghindarinya dengan menerapkan callback kustom dari
WindowManager ke UI Sistem saat layar ditambahkan, bukan 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
NavigationBarController
mengontrol semua fungsi khusus untuk panel navigasi. - Untuk melihat menu navigasi yang disesuaikan, lihat
CarStatusBar
. TYPE_NAVIGATION_BAR
tidak lagi dibatasi pada satu instance dan dapat digunakan per tampilan.IWindowManager#hasNavigationBar()
diperbarui untuk menyertakan parameterdisplayId
hanya untuk UI Sistem.
Peluncur
Di Android 10, setiap layar yang dikonfigurasi untuk mendukung
dekorasi sistem memiliki stack beranda khusus untuk aktivitas peluncur dengan jenis
WindowConfiguration#ACTIVITY_TYPE_HOME
, secara default. Setiap layar
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 di layar sekunder/eksternal. Untuk menyediakan aktivitas khusus bagi layar sekunder, Android 10 memperkenalkan kategori SECONDARY_HOME
dalam filter intent. Instance aktivitas ini digunakan di semua layar yang mendukung dekorasi sistem, satu 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 diharapkan dapat beradaptasi dengan berbagai ukuran layar. Mode peluncuran tidak boleh singleInstance
atau singleTask
.
Implementasi
Di Android 10, RootActivityContainer#startHomeOnDisplay()
secara otomatis memilih komponen dan intent yang diinginkan, bergantung pada layar
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 layar sekunder, untuk menghindari kemungkinan aplikasi berbahaya membuat layar virtual dengan Dekorasi sistem yang diaktifkan dan membaca informasi sensitif pengguna dari platform, peluncur hanya muncul di layar virtual yang dimiliki oleh sistem. Peluncur tidak menampilkan konten di tampilan virtual non-sistem.
Wallpaper
Di Android 10 dan yang lebih baru, wallpaper didukung di tampilan sekunder:
Gambar 2. Wallpaper animasi di layar internal (di atas) dan eksternal (di bawah).
Developer dapat mendeklarasikan dukungan untuk fitur wallpaper dengan menyediakan
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 mesin memiliki konteks tampilan dan permukaannya sendiri. Developer harus memastikan bahwa setiap mesin dapat menggambar secara independen, pada kecepatan frame yang berbeda, dengan mematuhi VSync.
Memilih wallpaper untuk setiap layar
Android 10 tidak menyediakan 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, jadi tidak ada jaminan bahwa
tampilan fisik akan memiliki ID yang sama setelah dimulai ulang.
Namun, Android 10 menambahkan DisplayInfo.mAddress
,
yang berisi ID stabil untuk tampilan fisik dan dapat digunakan untuk penerapan
penuh pada masa mendatang. Sayangnya, sudah terlambat untuk menerapkan logika
untuk Android 10. Solusi yang disarankan:
- Gunakan class
WallpaperManager
untuk menyetel wallpaper.WallpaperManager
diperoleh dari objekContext
, dan setiap objekContext
memiliki informasi tentang tampilan (Context#getDisplay()/getDisplayId()
) yang sesuai. Oleh karena itu, Anda dapat memperolehdisplayId
dari instanceWallpaperManager
tanpa menambahkan metode baru. - Di sisi framework, gunakan
displayId
yang diperoleh dari objekContext
dan petakan ke ID statis (seperti port tampilan fisik). Gunakan ID statis untuk mempertahankan wallpaper yang dipilih.
Solusi ini menggunakan implementasi yang ada untuk pemilih wallpaper. Jika dibuka di layar tertentu dan menggunakan konteks yang tepat, saat memanggil untuk menyetel wallpaper, sistem dapat mengidentifikasi layar secara otomatis.
Jika ada kebutuhan untuk menyetel wallpaper untuk tampilan selain tampilan saat ini, buat objek Context
baru untuk target tampilan (Context#createDisplayContext
) dan dapatkan instance WallpaperManager
dari tampilan tersebut.
Batasan keamanan
Sistem tidak akan menampilkan wallpaper di layar virtual yang bukan miliknya. 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 layar (seperti foto pribadi).
Implementasi
Di Android 10, antarmuka IWallpaperConnection#attachEngine()
dan IWallpaperService#attach()
menerima parameter
displayId
untuk membuat koneksi per layar.
WallpaperManagerService.DisplayConnector
merangkum mesin dan koneksi wallpaper per tampilan. Di WindowManager, pengontrol 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 telah ditambahkan, sehingga developer aplikasi dapat melaporkan wallpaper mana yang siap untuk beberapa layar.
Jika layanan wallpaper yang ditampilkan di layar default tidak mendukung beberapa layar, sistem akan menampilkan wallpaper default di layar sekunder:
Gambar 3. Logika penggantian wallpaper untuk tampilan sekunder.