Sistem Süslemeleri Desteği

Bu ekrana özel alanlarda yapılan güncellemeler aşağıda verilmiştir:

Sistem süslemeleri

Android 10, duvar kağıdı, gezinme çubuğu ve başlatıcı gibi belirli sistem dekorasyonlarını göstermek için ikincil ekranları yapılandırma desteği ekler. Varsayılan olarak, birincil ekran tüm sistem dekorasyonlarını gösterir ve ikincil ekranlar isteğe bağlı olarak etkinleştirilenleri gösterir. Giriş Yöntemi Düzenleyicisi (IME) desteği, diğer sistem dekorasyonlarından ayrı olarak ayarlanabilir.

Kullanım DisplayWindowSettings#setShouldShowSystemDecorsLocked() Belirli bir ekranda sistem süslemeleri için destek eklemek veya varsayılan bir değer sağlamak için /data/system/display_settings.xml . Örnekler için bkz Görüntü penceresi ayarlarını .

uygulama

DisplayWindowSettings#setShouldShowSystemDecorsLocked() aynı zamanda maruz WindowManager#setShouldShowSystemDecors() test etmek için. Sistem dekorlarını etkinleştirmek amacıyla bu yöntemin tetiklenmesi, daha önce eksik olan dekor pencerelerini eklemez veya daha önce mevcutsa bunları kaldırmaz. Çoğu durumda, sistem dekorasyon desteğinin değiştirilmesi, yalnızca cihaz yeniden başlatıldıktan sonra tam olarak etkili olur.

WindowManager kod tabanı sistemi süslemeleri desteklenmesi için Çekler genellikle geçmesi DisplayContent#supportsSystemDecorations() dış hizmetler için kontroller (örneğin Sistem UI olarak gezinti çubuğu gösterilmesi gerektiğini kontrol etmek) kullanırken WindowManager#shouldShowSystemDecors() . Bu ayar tarafından neyin kontrol edildiğini anlamak için bu yöntemlerin çağrı noktalarını inceleyin.

Sistem UI dekor pencereleri

Gezinti çubuğu faaliyetleri ve uygulamalar arasında gezinmek için esastır çünkü Android 10, sadece navigasyon çubuğu için sistem dekor pencere destek ekler. Varsayılan olarak, gezinme çubuğu Geri ve Ev olanaklarını gösterir. Bu hedef görüntüleme sistemi süslemeleri (bkz destekliyorsa dahildir DisplayWindowSettings ).

O da Bildirim Shade Hızlı Ayarları ve Kilit Ekranı içerdiğinden durum çubuğu, daha karmaşık sistem penceredir. Android 10'da durum çubuğu ikincil ekranlarda desteklenmez. Bu nedenle bildirimler, ayarlar ve tam tuş kilidi yalnızca birincil ekranda kullanılabilir.

Genel / Son Kullanılanlar sistem penceresi ikinci ekranlarda desteklenmez. Android 10'da AOSP, varsayılan ekranda yalnızca Son Kullanılanları görüntüler ve tüm ekranlardaki etkinlikleri içerir. Son Kullanılanlar'dan başlatıldığında, ikincil bir ekranda olan bir etkinlik varsayılan olarak o ekranda öne getirilir. Bu yaklaşımın, uygulamalar diğer ekranlarda göründüğünde hemen güncellenmemesi gibi bilinen bazı sorunları vardır.

uygulama

Ek Sistem Kullanıcı Arabirimi özelliklerini uygulamak için cihaz üreticileri, ekranların eklenmesini/kaldırılmasını dinleyen ve uygun içeriği sunan tek bir Sistem Kullanıcı Arabirimi bileşeni kullanmalıdır.

Çoklu Ekranı (MD) destekleyen bir Sistem Kullanıcı Arabirimi bileşeni aşağıdaki durumları ele almalıdır:

  • Başlangıçta çoklu ekran başlatma
  • Çalışma zamanında eklenen ekran
  • Çalışma zamanında kaldırılan ekran

Sistem Kullanıcı Arabirimi, WindowManager'dan önce bir ekranın eklendiğini algıladığında, bir yarış durumu oluşturur. Bu bir görüntü yerine DisplayManager abone arasında eklendiğinde Sistem arayüzüne WindowManager gelen özel bir geri arama uygulayarak önlenebilir .DisplayListener olaylar. Bir başvuru uygulaması için bkz CommandQueue.Callbacks#onDisplayReady gezinti çubuğu desteği ve için WallpaperManagerInternal#onDisplayReady duvar kağıtları için.

Ek olarak, Android 10 şu güncellemeleri sağlar:

  • NavigationBarController sınıf gezinti çubukları için tüm işlevselliği özgü kontrol eder.
  • Özelleştirilmiş bir gezinti çubuğu görüntülemek için bkz CarStatusBar .
  • TYPE_NAVIGATION_BAR artık tek bir örneği ile sınırlıdır ve görüntü başına kullanılabilir.
  • IWindowManager#hasNavigationBar() içerecek şekilde güncellenir displayId sadece Sistem UI için parametre.

Başlatıcı

Android 10, destek sistemi süslemeleri için yapılandırılmış her ekran tipi ile başlatıcısı faaliyetleri için özel bir ev yığını vardır WindowConfiguration#ACTIVITY_TYPE_HOME varsayılan olarak. Her ekran, ayrı bir başlatıcı etkinliği örneği kullanır.

Şekil 1. Çok ekran başlatıcısı, örneğin platform/development/samples/MultiDisplay

Mevcut başlatıcıların çoğu birden çok örneği desteklemez ve büyük ekran boyutları için optimize edilmemiştir. Ayrıca, ikincil/harici ekranlarda genellikle farklı türde bir deneyim beklenir. İkincil ekranlar için özel bir aktivite sağlayan Android 10 tanıtır için SECONDARY_HOME niyet filtrelerde kategorisi. Bu etkinliğin örnekleri, sistem dekorasyonlarını destekleyen tüm ekranlarda, ekran başına bir tane olmak üzere kullanılır.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

Etkinliğin, birden çok örneği engellemeyen ve farklı ekran boyutlarına uyum sağlaması beklenen bir başlatma modu olmalıdır. Fırlatma modu olamaz singleInstance veya singleTask .

uygulama

Android 10 yılında RootActivityContainer#startHomeOnDisplay() otomatik olarak ana ekran başlatılır ekrana bağlı olarak istenilen bileşeni ve niyet seçer. RootActivityContainer#resolveSecondaryHomeActivity() gerekirse seçili başlatıcı bağlı başlatıcısı aktivite bileşenini aramak için mantığı içerir ve sistem varsayılan kullanabilirsiniz (bkz ActivityTaskManagerService#getSecondaryHomeIntent() ).

Güvenlik kısıtlamaları

Kötü niyetli bir uygulama etkin bir sanal ekran yaratan olasılığını ortadan kaldırmak, ikincil ekranlarda faaliyetlere uygulanan kısıtlamalar yanında Sistem süslemeleri ve yüzeyden kullanıcı hassas bilgileri okuyarak, başlatıcısı yalnızca sistem tarafından sahip olunan sanal ekranlarda görünür. Başlatıcı, sistem dışı sanal ekranlarda içerik görüntülemez.

Duvar kağıtları

Android 10'da (ve sonraki sürümlerde), ikincil ekranlarda duvar kağıtları desteklenir:

İç (yukarıda) ve dış ekranlarda Şekil 2. Canlı duvar kağıdı (aşağıda)

Geliştiriciler sağlayarak kağıdı özelliği desteği ilan edebilir android:supportsMultipleDisplays="true" in WallpaperInfo XML tanım. Duvar kağıdı geliştiricileri de görünen bağlamı kullanarak varlıkları yüklemeye beklenen WallpaperService.Engine#getDisplayContext() .

Çerçeve bir oluşturur WallpaperService.Engine her motor kendi yüzeyi ve ekran bağlamı vardır, böylece ekranın başına örneği. Geliştiricinin, her motorun VSYNC'e uygun olarak farklı kare hızlarında bağımsız olarak çizebildiğinden emin olması gerekir.

Bireysel ekranlar için duvar kağıtları seçme

Android 10, ayrı ekranlar için duvar kağıtları seçmek için doğrudan platform desteği sağlamaz. Bunu başarmak için, ekran başına duvar kağıdı ayarlarını sürdürmek için kararlı bir ekran tanımlayıcısı gerekir. Display#getDisplayId() dinamik olduğundan, fiziksel bir ekran yeniden başlatıldıktan sonra aynı kimliğe sahip olacağı garantisi yoktur.

Ancak Android 10 katma DisplayInfo.mAddress fiziksel ekranlar için kararlı tanımlayıcıları içerir ve gelecekte tam olarak uygulanması için de kullanılabilir. Ne yazık ki, Android 10 için mantığı uygulamak için çok geç. Önerilen çözüm:

  1. Kullanım WallpaperManager duvar kağıtları ayarlamak için API.
  2. WallpaperManager bir elde edilen Context nesnesi ve her Context nesne ekran gelen hakkında bilgi vardır ( Context#getDisplay()/getDisplayId() ). Bu nedenle, elde edebilirsiniz displayId bir gelen WallpaperManager yeni yöntemler eklemeden örneği.
  3. Çerçeve tarafında, kullanım displayId bir elde edilen Context nesne ve (örneğin, bir fiziksel ekranının bir bağlantı noktası olarak), statik tanımlayıcıya eşlemek. Seçilen duvar kağıdını kalıcı kılmak için statik tanımlayıcıyı kullanın.

Bu geçici çözüm, duvar kağıdı seçicileri için mevcut uygulamaları kullanır. Belirli bir ekranda açıldıysa ve doğru bağlamı kullanıyorsa, bir duvar kağıdı ayarlamak için aradığında sistem ekranı otomatik olarak tanımlayabilir.

Geçerli göstergeden başka gösterilmesi ayarlarının duvar kağıdı için bir ihtiyaç varsa, o zaman yeni bir oluşturmak Context hedef ekranı (için nesne Context#createDisplayContext ) ve elde WallpaperManager o ekranından örneği.

Güvenlik kısıtlamaları

Sistem, sahip olmadığı sanal ekranlarda duvar kağıtlarını göstermez. Bunun nedeni, kötü amaçlı bir uygulamanın, etkinleştirilmiş sistem süslemeleri desteğiyle sanal bir ekran oluşturabileceği ve yüzeyden kullanıcıya duyarlı bilgileri okuyabileceği (kişisel bir fotoğraf gibi) güvenlik endişesidir.

uygulama

Android 10'da IWallpaperConnection#attachEngine() ve IWallpaperService#attach() arayüzleri kabul displayId başına ekrana bağlantılarını oluşturmak üzere Parametre. WallpaperManagerService.DisplayConnector başına ekran duvar kağıdı motoru ve bağlantı kapsüller. WindowManager olarak, duvar kağıdı kontrolörler her biri için oluşturulan DisplayContent inşaatında nesnenin yerine tek WallpaperController tüm ekranlar için.

Kamu bazıları WallpaperManager yöntemi uygulamaları (örneğin WallpaperManager#getDesiredMinimumWidth() ) hesaplamak ve görüntüler karşılık gelen için bilgi sağlamak için güncellenmiştir. WallpaperInfo#supportsMultipleDisplays() bu uygulama geliştiricileri çoklu ekran için hazır olan duvar kağıtları bildirebilmeleri ve karşılık gelen kaynak niteliği, eklenmiştir.

Varsayılan ekranda gösterilen duvar kağıdı hizmeti birden fazla ekranı desteklemiyorsa, sistem ikincil ekranlarda varsayılan duvar kağıdını gösterir.

İkincil ekranların Şekil 3. Wallpaper yedek mantık