Pembaruan yang dilakukan pada area khusus tampilan ini disediakan di bawah:
Dekorasi sistem
Android 10 menambahkan dukungan untuk mengonfigurasi tampilan sekunder untuk menampilkan dekorasi sistem tertentu, seperti wallpaper, bilah navigasi, dan peluncur. Secara default, tampilan utama menampilkan semua dekorasi sistem, dan tampilan sekunder menampilkan dekorasi yang diaktifkan secara opsional. Dukungan untuk Editor Metode Input (IME) dapat diatur secara terpisah dari dekorasi sistem lainnya.
Gunakan DisplayWindowSettings#setShouldShowSystemDecorsLocked()
untuk menambahkan dukungan dekorasi sistem pada tampilan tertentu atau memberikan nilai default di /data/system/display_settings.xml
. Misalnya, lihat Pengaturan jendela tampilan .
Penerapan
DisplayWindowSettings#setShouldShowSystemDecorsLocked()
juga diekspos di WindowManager#setShouldShowSystemDecors()
untuk pengujian. Memicu metode ini dengan maksud untuk mengaktifkan dekorasi sistem tidak menambahkan jendela dekorasi yang sebelumnya hilang, atau menghapusnya jika sebelumnya ada. Dalam kebanyakan kasus, perubahan dukungan dekorasi sistem akan berlaku sepenuhnya hanya setelah perangkat di-boot ulang.
Pemeriksaan dukungan dekorasi sistem dalam basis kode WindowManager biasanya dilakukan melalui DisplayContent#supportsSystemDecorations()
sedangkan pemeriksaan layanan eksternal (seperti UI Sistem untuk memeriksa apakah bilah navigasi harus ditampilkan) menggunakan WindowManager#shouldShowSystemDecors()
. Untuk memahami apa yang dikontrol oleh pengaturan ini, jelajahi titik panggilan metode ini.
Jendela dekorasi UI sistem
Android 10 menambahkan dukungan jendela dekorasi sistem untuk bilah navigasi saja , karena bilah navigasi sangat penting untuk bernavigasi antara aktivitas dan aplikasi. Secara default, bilah navigasi menampilkan tarif Kembali dan Beranda. Ini disertakan hanya jika tampilan target mendukung dekorasi sistem (lihat DisplayWindowSettings
).
Bilah status adalah jendela sistem yang lebih rumit, karena juga berisi Bayangan Pemberitahuan, Pengaturan Cepat, dan Layar Kunci. Di Android 10, bilah status tidak didukung pada tampilan sekunder. Oleh karena itu, notifikasi, pengaturan, dan pengaman tombol lengkap hanya tersedia di tampilan utama.
Jendela sistem Ikhtisar/Terbaru tidak didukung di layar sekunder. Di Android 10, AOSP hanya menampilkan Terkini pada tampilan default dan berisi aktivitas dari semua tampilan. Saat diluncurkan dari Terbaru, aktivitas yang ada di tampilan sekunder akan ditampilkan di depan tampilan tersebut, secara default. Pendekatan ini memiliki beberapa masalah umum, seperti tidak segera memperbarui saat aplikasi muncul di layar lain.
Penerapan
Untuk mengimplementasikan fitur UI Sistem tambahan, produsen perangkat harus menggunakan satu komponen UI Sistem yang mendengarkan penambahan/penghapusan tampilan dan menyajikan konten yang sesuai.
Komponen UI Sistem yang mendukung Multi-Display (MD) harus menangani kasus berikut:
- Inisialisasi beberapa tampilan saat startup
- Tampilan ditambahkan saat runtime
- Tampilan dihapus saat runtime
Saat UI Sistem mendeteksi penambahan tampilan sebelum WindowManager, kondisi balapan akan dibuat. Hal ini dapat dihindari dengan menerapkan panggilan balik khusus dari WindowManager ke UI Sistem saat tampilan ditambahkan alih-alih berlangganan peristiwa DisplayManager .DisplayListener
. Untuk implementasi referensi, lihat CommandQueue.Callbacks#onDisplayReady
untuk dukungan bilah navigasi dan WallpaperManagerInternal#onDisplayReady
untuk wallpaper.
Selain itu, Android 10 menyediakan pembaruan berikut:
- Kelas
NavigationBarController
mengontrol semua fungsi khusus untuk bilah navigasi. - Untuk melihat bilah navigasi yang disesuaikan, lihat
CarStatusBar
. -
TYPE_NAVIGATION_BAR
tidak lagi terbatas pada satu instance dan dapat digunakan per tampilan. -
IWindowManager#hasNavigationBar()
diperbarui untuk menyertakan parameterdisplayId
hanya untuk UI Sistem.
Peluncur
Di Android 10, setiap tampilan yang dikonfigurasi untuk mendukung dekorasi sistem memiliki tumpukan beranda khusus untuk aktivitas peluncur dengan tipe WindowConfiguration#ACTIVITY_TYPE_HOME
, secara default. Setiap tampilan menggunakan aktivitas peluncur yang terpisah.
Gambar 1. Contoh peluncur multi-display untuk platform/development/samples/MultiDisplay
Kebanyakan peluncur yang ada tidak mendukung banyak contoh dan tidak dioptimalkan untuk ukuran layar besar. Selain itu, pengalaman berbeda sering kali diharapkan pada tampilan sekunder/eksternal. Untuk menyediakan aktivitas khusus untuk layar sekunder, Android 10 memperkenalkan kategori SECONDARY_HOME
di filter maksud. Contoh aktivitas ini digunakan pada semua tampilan yang mendukung dekorasi sistem, satu per tampilan.
<activity> ... <intent-filter> <category android:name="android.intent.category.SECONDARY_HOME" /> ... </intent-filter> </activity>
Aktivitas harus memiliki mode peluncuran yang tidak mencegah banyak kejadian dan diharapkan dapat beradaptasi dengan ukuran layar yang berbeda. Mode peluncuran tidak boleh singleInstance
atau singleTask
.
Penerapan
Di Android 10, RootActivityContainer#startHomeOnDisplay()
secara otomatis memilih komponen dan maksud yang diinginkan bergantung pada tampilan tempat layar beranda diluncurkan. RootActivityContainer#resolveSecondaryHomeActivity()
berisi logika untuk mencari komponen aktivitas peluncur bergantung pada peluncur yang dipilih saat ini dan dapat menggunakan default sistem, jika diperlukan (lihat ActivityTaskManagerService#getSecondaryHomeIntent()
).
Pembatasan keamanan
Selain pembatasan yang berlaku pada aktivitas di tampilan sekunder, untuk menghindari kemungkinan aplikasi jahat membuat tampilan virtual dengan dekorasi Sistem diaktifkan dan membaca informasi sensitif pengguna dari permukaan, peluncur hanya muncul di tampilan virtual milik sistem. Peluncur tidak menampilkan konten pada tampilan virtual non-sistem.
Wallpaper
Di Android 10 (dan lebih tinggi), wallpaper didukung di tampilan sekunder:
Gambar 2. Wallpaper hidup di layar internal (atas) dan eksternal (bawah)
Pengembang dapat mendeklarasikan dukungan untuk fitur wallpaper dengan menyediakan android:supportsMultipleDisplays="true"
dalam definisi XML WallpaperInfo
. Pengembang wallpaper juga diharapkan memuat aset menggunakan konteks tampilan di WallpaperService.Engine#getDisplayContext()
.
Kerangka kerja ini membuat satu instance WallpaperService.Engine
per tampilan, sehingga setiap mesin memiliki permukaan dan konteks tampilannya sendiri. Pengembang perlu memastikan bahwa setiap mesin dapat menggambar secara independen, pada frame rate yang berbeda, dengan memperhatikan VSYNC.
Pilih wallpaper untuk masing-masing layar
Android 10 tidak menyediakan dukungan platform langsung untuk memilih wallpaper untuk setiap layar. Untuk mencapai hal ini, pengidentifikasi tampilan yang stabil diperlukan untuk mempertahankan pengaturan wallpaper per tampilan. Display#getDisplayId()
bersifat dinamis, jadi tidak ada jaminan bahwa tampilan fisik akan memiliki ID yang sama setelah reboot.
Namun, Android 10 menambahkan DisplayInfo.mAddress
, yang berisi pengidentifikasi stabil untuk tampilan fisik dan dapat digunakan untuk implementasi penuh di masa mendatang. Sayangnya, sudah terlambat untuk mengimplementasikan logika untuk Android 10. Solusi yang disarankan:
- Gunakan
WallpaperManager
API untuk mengatur wallpaper. -
WallpaperManager
diperoleh dari objekContext
, dan setiap objekContext
memiliki informasi tentang tampilan yang sesuai (Context#getDisplay()/getDisplayId()
). Oleh karena itu, Anda bisa mendapatkandisplayId
dari instanceWallpaperManager
tanpa menambahkan metode baru. - Di sisi kerangka kerja, gunakan
displayId
yang diperoleh dari objekContext
dan petakan ke pengidentifikasi statis (seperti port tampilan fisik). Gunakan pengidentifikasi statis untuk mempertahankan wallpaper yang dipilih.
Solusi ini menggunakan implementasi yang ada untuk pemetik wallpaper. Jika dibuka pada tampilan tertentu dan menggunakan konteks yang tepat, maka ketika dipanggil untuk menyetel wallpaper, sistem dapat secara otomatis mengidentifikasi tampilan tersebut.
Jika ada kebutuhan untuk menyetel wallpaper untuk tampilan selain tampilan saat ini, buatlah objek Context
baru untuk tampilan target ( Context#createDisplayContext
) dan dapatkan instance WallpaperManager
dari tampilan tersebut.
Pembatasan keamanan
Sistem tidak akan menampilkan wallpaper pada tampilan virtual yang bukan miliknya. Hal ini disebabkan oleh masalah keamanan sehingga aplikasi jahat dapat membuat tampilan virtual dengan dukungan dekorasi sistem yang diaktifkan dan membaca informasi sensitif pengguna dari permukaan (seperti foto pribadi).
Penerapan
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()
) telah diperbarui untuk menghitung dan memberikan informasi untuk tampilan terkait. WallpaperInfo#supportsMultipleDisplays()
dan atribut sumber daya terkait telah ditambahkan, sehingga pengembang aplikasi dapat melaporkan wallpaper mana yang siap untuk beberapa layar.
Jika layanan wallpaper yang ditampilkan pada tampilan default tidak mendukung beberapa tampilan, maka sistem akan menampilkan wallpaper default pada tampilan sekunder.
Gambar 3. Logika penggantian wallpaper untuk tampilan sekunder