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.

Belirli bir ekranda sistem süslemeleri için destek eklemek veya /data/system/display_settings.xml içinde varsayılan bir değer sağlamak için DisplayWindowSettings#setShouldShowSystemDecorsLocked() kullanın. Örnekler için, bkz. Ekran penceresi ayarları .

uygulama

DisplayWindowSettings#setShouldShowSystemDecorsLocked() ayrıca test için WindowManager#setShouldShowSystemDecors() içinde gösterilir. 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ındaki sistem süslemelerinin desteğine yönelik kontroller genellikle DisplayContent#supportsSystemDecorations() üzerinden yapılırken, harici hizmetler (gezinme çubuğunun gösterilip gösterilmemesi gerektiğini kontrol etmek için Sistem Kullanıcı Arayüzü gibi) kontrolleri WindowManager#shouldShowSystemDecors() kullanır. Bu ayar tarafından neyin kontrol edildiğini anlamak için bu yöntemlerin çağrı noktalarını inceleyin.

Sistem UI dekor pencereleri

Android 10, yalnızca gezinme çubuğu için sistem dekor penceresi desteği ekler, çünkü gezinme çubuğu etkinlikler ve uygulamalar arasında gezinmek için gereklidir. Varsayılan olarak, gezinme çubuğu Geri ve Ev olanaklarını gösterir. Bu, yalnızca hedef ekran sistem dekorasyonlarını destekliyorsa dahil edilir (bkz. DisplayWindowSettings ).

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

Genel Bakış/Son Kullanılanlar sistem penceresi ikincil 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 bazı bilinen 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, DisplayManager .DisplayListener olaylarına abone olmak yerine bir ekran eklendiğinde WindowManager'dan Sistem Kullanıcı Arabirimine özel bir geri arama uygulanarak önlenebilir. Başvuru uygulaması için, gezinme çubuğu desteği için CommandQueue.Callbacks#onDisplayReady ve duvar kağıtları için WallpaperManagerInternal#onDisplayReady bakın.

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

  • NavigationBarController sınıfı, gezinme çubuklarına özgü tüm işlevleri kontrol eder.
  • Özelleştirilmiş bir gezinme çubuğunu görüntülemek için bkz. CarStatusBar .
  • TYPE_NAVIGATION_BAR artık tek bir örnekle sınırlı değildir ve ekran başına kullanılabilir.
  • IWindowManager#hasNavigationBar() , yalnızca Sistem Kullanıcı Arabirimi için displayId parametresini içerecek şekilde güncellendi.

Başlatıcı

Android 10'da, sistem dekorasyonlarını desteklemek üzere yapılandırılan her ekranın, varsayılan olarak WindowConfiguration#ACTIVITY_TYPE_HOME türünde başlatıcı etkinlikleri için ayrılmış bir ana yığını vardır. Her ekran, ayrı bir başlatıcı etkinliği örneği kullanır.

Şekil 1. platform/development/samples/MultiDisplay için çok ekranlı başlatıcı örneği

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 etkinlik sağlamak için Android 10, niyet filtrelerinde SECONDARY_HOME kategorisini sunar. 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. Başlatma modu singleInstance veya singleTask .

uygulama

Android 10'da RootActivityContainer#startHomeOnDisplay() , ana ekranın başlatıldığı ekrana bağlı olarak istenen bileşeni ve amacı otomatik olarak seçer. RootActivityContainer#resolveSecondaryHomeActivity() , seçili başlatıcıya bağlı olarak başlatıcı etkinlik bileşenini aramak için mantığı içerir ve gerekirse sistem varsayılanını kullanabilir (bkz. ActivityTaskManagerService#getSecondaryHomeIntent() ).

Güvenlik kısıtlamaları

İkincil ekranlardaki etkinliklere uygulanan kısıtlamalara ek olarak, kötü amaçlı bir uygulamanın Sistem süslemeleri etkinleştirilmiş bir sanal ekran oluşturma ve yüzeyden kullanıcıya duyarlı bilgileri okuma olasılığını önlemek için, başlatıcı yalnızca sisteme ait 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:

Şekil 2. Dahili (yukarıda) ve harici ekranlarda (aşağıda) canlı duvar kağıdı

Geliştiriciler, WallpaperInfo XML tanımında android:supportsMultipleDisplays="true" sağlayarak duvar kağıdı özelliği için destek beyan edebilir. Duvar kağıdı geliştiricilerinin ayrıca WallpaperService.Engine#getDisplayContext() içindeki görüntüleme bağlamını kullanarak varlıkları yüklemeleri beklenir.

Çerçeve, ekran başına bir WallpaperService.Engine örneği oluşturur, böylece her motorun kendi yüzeyi ve görüntü bağlamı olur. 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() dinamiktir, bu nedenle yeniden başlattıktan sonra fiziksel bir ekranın aynı kimliğe sahip olacağının garantisi yoktur.

Ancak, Android 10, fiziksel ekranlar için kararlı tanımlayıcılar içeren ve gelecekte tam bir uygulama için kullanılabilecek DisplayInfo.mAddress ekledi. Ne yazık ki, Android 10 için mantığı uygulamak için çok geç. Önerilen çözüm:

  1. Duvar kağıtlarını ayarlamak için WallpaperManager API'sini kullanın.
  2. WallpaperManager , bir Context nesnesinden elde edilir ve her Context nesnesi, karşılık gelen görüntüleme hakkında bilgi içerir ( Context#getDisplay()/getDisplayId() ). Bu nedenle, yeni yöntemler eklemeden bir WallpaperManager örneğinden displayId elde edebilirsiniz.
  3. Çerçeve tarafında, bir Context nesnesinden elde edilen displayId kullanın ve bunu statik bir tanımlayıcıyla (fiziksel bir ekranın bağlantı noktası gibi) eşleyin. 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 ekran dışında bir ekran için duvar kağıdı ayarlamaya ihtiyaç varsa, hedef ekran için yeni bir Context nesnesi oluşturun ( Context#createDisplayContext ) ve bu ekrandan WallpaperManager örneğini alın.

Güvenlik kısıtlamaları

Sistem, sahip olmadığı sanal ekranlarda duvar kağıtları 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ı bir bilgiyi (kişisel bir fotoğraf gibi) okuyabileceği yönündeki bir güvenlik endişesidir.

uygulama

Android 10'da, IWallpaperConnection#attachEngine() ve IWallpaperService#attach() arabirimleri, ekran başına bağlantılar oluşturmak için displayId parametresini kabul eder. WallpaperManagerService.DisplayConnector , ekran başına bir duvar kağıdı motorunu ve bağlantısını kapsar. WindowManager'da, tüm ekranlar için tek bir WallpaperController yerine yapım aşamasındaki her DisplayContent nesnesi için duvar kağıdı denetleyicileri oluşturulur.

Genel WallpaperManager yöntemi uygulamalarından bazıları ( WallpaperManager#getDesiredMinimumWidth() gibi), karşılık gelen ekranlar için bilgi sağlamak ve hesaplamak üzere güncellendi. WallpaperInfo#supportsMultipleDisplays() ve ilgili kaynak özniteliği eklendi, böylece uygulama geliştiricileri hangi duvar kağıtlarının birden çok ekran için hazır olduğunu bildirebilir.

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

Şekil 3. İkincil ekranlar için duvar kağıdı geri dönüş mantığı