Praktik yang direkomendasikan

Aplikasi untuk perangkat yang dapat dilipat dan multilayar

Secara umum, aplikasi tidak boleh bergantung pada pengidentifikasi statis atau logika yang bergantung pada beberapa ID tampilan. Dalam kebanyakan kasus, aplikasi harus diubah ukurannya dan berfungsi pada tampilan yang berbeda dan sistem harus mengontrol lokasi aplikasi. Misalnya, untuk membangun pengalaman baru dan unik untuk perangkat yang dapat dilipat dan meluncurkan aplikasi khusus di layar eksternal saat perangkat dalam keadaan terlipat.

Dalam hal ini, SystemUI (atau komponen sistem lainnya) harus mendeteksi lipatan tersebut, menentukan apakah tindakan tersebut tepat untuk dilakukan, lalu meluncurkan aktivitas target dan menentukan ID tampilan eksternal sebagai target peluncuran. Aplikasi tidak boleh mendeteksi tindakan ini atau melakukan tindakan apa pun sebagai respons, lalu melakukan peluncuran pada tampilan tertentu. Dengan kata lain, jangan berasumsi bahwa apa yang berfungsi di satu perangkat akan berfungsi di perangkat lain. Singkatnya, kode khusus perangkat meningkatkan fragmentasi.

Batasi akses ke tampilan

Jika konfigurasi perangkat memerlukan pembatasan akses ke satu atau lebih tampilan, rekomendasinya adalah menggunakan tanda Display#FLAG_PRIVATE untuk menetapkan tampilan tersebut sebagai private . Melakukan hal itu akan membatasi semua orang kecuali pemiliknya untuk menambahkan konten ke tampilan. Setiap upaya untuk meluncurkan aktivitas atau menambahkan jendela oleh siapa pun kecuali pemiliknya akan menghasilkan SecurityException . Jika sistem memiliki tampilan tersebut, sistem dapat menambahkan jendela dan meluncurkan aktivitas.

Selain itu, entitas yang ditempatkan pada tampilan selalu dapat mengakses tampilan tersebut. Jika pemilik meluncurkan aktivitas pada tampilan, maka aktivitas tersebut dapat meluncurkan aktivitas lain pada tampilan ini. Oleh karena itu, pemilik bertanggung jawab untuk membatasi akses dan hanya mengizinkan aplikasi tepercaya .

Selain itu, lebih banyak batasan ditambahkan pada tampilan virtual karena aplikasi apa pun dapat membuatnya tanpa membuatnya terlihat oleh pengguna. Jika tampilan virtual tidak dimiliki oleh sistem, maka hanya aktivitas dengan allowEmbedded yang diizinkan dan pemanggil harus memiliki izin ACTIVITY_EMBEDDING .

Untuk informasi lebih lanjut, lihat:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#isUidPresentOnDisplay()

Untuk mengontrol peluncuran aktivitas secara kondisional, gunakan LaunchParamsController , yang mencegat semua peluncuran aktivitas dan memungkinkan komponen sistem mengubah parameter yang digunakan untuk peluncuran. Ini tersedia di system_server .

Konfigurasikan pengaturan jendela tampilan dan dekorasi sistem

Dekorasi sistem dapat dikonfigurasi per tampilan di DisplayWindowSettings . Implementasi perangkat dapat menyediakan konfigurasi default di /data/system/display_settings.xml .

Nilai ini menentukan apakah dekorasi sistem (peluncur, wallpaper, bilah navigasi, dan jendela dekorasi lainnya) dan IME muncul di layar. Untuk detailnya, lihat DisplayWindowSettings#shouldShowSystemDecorsLocked() dan DisplayWindowSettings#shouldShowImeLocked() .

Untuk mengidentifikasi tampilan, gunakan ID unik (default ini menggunakan DisplayInfo#uniqueId ) atau ID port fisik untuk tampilan perangkat keras (lihat DisplayInfo#address ).

Misalnya, contoh konfigurasi tampilan berikut mengaktifkan dekorasi sistem dan IME pada tampilan 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 tampilan pada atribut name, yang untuk tampilan simulasinya adalah overlay:1 . Untuk tampilan bawaan, nilai sampel mungkin "local:45354385242535243453" . Opsi lainnya adalah menggunakan informasi port perangkat keras dan mengatur 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 detailnya, lihat Pengidentifikasi tampilan statis .

Untuk informasi lebih lanjut, lihat: