Sistem süslemeleri desteği

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

Sistem dekorasyonları

Android 10, ikincil ekranları duvar kağıdı, gezinme çubuğu ve başlatıcı gibi belirli sistem dekorasyonlarını gösterecek şekilde yapılandırmak için destek 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 dekorasyonlarına destek eklemek veya /data/system/display_settings.xml dosyasında varsayılan bir değer sağlamak için DisplayWindowSettings#setShouldShowSystemDecorsLocked() öğesini kullanın. Örnekler için bkz . Ekran penceresi ayarları .

Uygulama

DisplayWindowSettings#setShouldShowSystemDecorsLocked() ayrıca test için WindowManager#setShouldShowSystemDecors() içinde kullanıma sunulur. Sistem dekorlarını etkinleştirmek amacıyla bu yöntemin tetiklenmesi, daha önce eksik olan dekor pencerelerini eklemez veya önceden mevcutsa bunları kaldırmaz. Çoğu durumda, sistem dekorasyon desteğindeki değişiklik yalnızca cihazın yeniden başlatılmasından sonra tam olarak etkili olur.

WindowManager kod tabanındaki sistem dekorasyonlarının desteklenmesine yönelik kontroller genellikle DisplayContent#supportsSystemDecorations() üzerinden yapılırken, harici hizmetler için yapılan kontroller (gezinme çubuğunun gösterilip gösterilmeyeceğini kontrol etmek için Sistem Kullanıcı Arayüzü gibi) WindowManager#shouldShowSystemDecors() kullanır. Bu ayarla neyin kontrol edildiğini anlamak için bu yöntemlerin çağrı noktalarını inceleyin.

Sistem kullanıcı arayüzü 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 Ana Sayfa olanaklarını gösterir. Bu, yalnızca hedef ekranın sistem dekorasyonlarını desteklemesi durumunda dahil edilir (bkz. DisplayWindowSettings ).

Durum çubuğu daha karmaşık bir sistem penceresidir çünkü aynı zamanda Bildirim Gölgesini, Hızlı Ayarları ve Kilit Ekranını da içerir. Android 10'da durum çubuğu ikincil ekranlarda desteklenmemektedir. Bu nedenle bildirimler, ayarlar ve tam tuş kilidi yalnızca birincil ekranda mevcuttur.

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 ekranda bulunan bir etkinlik varsayılan olarak o ekranda öne çıkarılır. 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ı Arayüzü ö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ı Arayüzü bileşeni kullanmalıdır.

Çoklu Ekranı (MD) destekleyen bir Sistem Kullanıcı Arayüzü 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 ekran kaldırıldı

Sistem Kullanıcı Arayüzü, WindowManager'dan önce bir ekranın eklendiğini algıladığında bir yarış durumu oluşturur. DisplayManager .DisplayListener olaylarına abone olmak yerine bir ekran eklendiğinde WindowManager'dan Sistem Kullanıcı Arayüzüne özel bir geri çağırma uygulanarak bu durum önlenebilir. Referans uygulaması için, gezinme çubuğu desteği için CommandQueue.Callbacks#onDisplayReady ve duvar kağıtları için WallpaperManagerInternal#onDisplayReady bakın.

Ayrıca Android 10 şu güncellemeleri de sağlıyor:

  • NavigationBarController sınıfı, gezinme çubuklarına özgü tüm işlevleri denetler.
  • Özelleştirilmiş bir gezinme çubuğunu görüntülemek için CarStatusBar bakın.
  • 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ı Arayüzü için displayId parametresini içerecek şekilde güncellendi.

Başlatıcı

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

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

Mevcut başlatıcıların çoğu birden fazla ö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 ekranlara özel bir etkinlik sağlamak için Android 10, amaç 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 fazla örneği engellemeyen ve farklı ekran boyutlarına uyum sağlaması beklenen bir başlatma moduna sahip olması gerekir. Başlatma modu singleInstance veya singleTask olamaz.

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() halihazırda seçili başlatıcıya bağlı olarak başlatıcı etkinliği bileşenini arama mantığını 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 dekorasyonları etkinleştirilmiş bir sanal ekran oluşturması ve yüzeyden kullanıcıya duyarlı bilgileri okuması olasılığını önlemek için başlatıcı yalnızca sisteme ait sanal ekranlarda görünür. Başlatıcı, içeriği sistem dışı sanal ekranlarda görüntülemez.

Duvar kağıtları

Android 10'da (ve üzeri) duvar kağıtları ikincil ekranlarda desteklenir:

Şekil 2. Dahili (yukarıda) ve harici ekranlardaki (altta) 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 edebilirler. 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 motor kendi yüzeyine ve ekran bağlamına sahip olur. Geliştiricinin, VSYNC'e uygun olarak her motorun farklı kare hızlarında bağımsız olarak çizim yapabildiğinden emin olması gerekir.

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

Android 10, ayrı ekranlar için duvar kağıtlarının seçilmesine yönelik doğrudan platform desteği sağlamaz. Bunu başarmak için, ekran başına duvar kağıdı ayarlarının kalıcı olmasını sağlayacak kararlı bir ekran tanımlayıcıya ihtiyaç vardır. Display#getDisplayId() dinamiktir, dolayısıyla fiziksel ekranın yeniden başlatmanın ardından 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 uygulama için kullanılabilecek DisplayInfo.mAddress ekledi. Ne yazık ki Android 10 mantığını uygulamak için artık ç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ü hakkında bilgi içerir ( Context#getDisplay()/getDisplayId() ). Bu nedenle, yeni yöntemler eklemeden bir WallpaperManager örneğinden displayId alabilirsiniz.
  3. Çerçeve tarafında, bir Context nesnesinden elde edilen displayId kullanın ve onu statik bir tanımlayıcıyla (fiziksel ekranın bağlantı noktası gibi) eşleştirin. 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çicilere yönelik mevcut uygulamaları kullanır. Belirli bir ekranda açılmışsa ve doğru bağlamı kullanıyorsa, bir duvar kağıdı ayarlamak için çağrıldığında sistem, ekranı otomatik olarak tanımlayabilir.

Geçerli ekran dışında bir ekran için duvar kağıdını ayarlamaya ihtiyaç varsa, hedef ekran için yeni bir Context nesnesi oluşturun ( Context#createDisplayContext ) ve bu ekrandan WallpaperManager örneğini edinin.

Güvenlik kısıtlamaları

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

Uygulama

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

Genel WallpaperManager yöntemi uygulamalarından bazıları ( WallpaperManager#getDesiredMinimumWidth() gibi), ilgili ekranlar için bilgi hesaplamak ve bilgi sağlamak üzere güncellendi. WallpaperInfo#supportsMultipleDisplays() ve buna karşılık gelen bir kaynak özelliği eklendi, böylece uygulama geliştiricileri hangi duvar kağıtlarının birden fazla 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ığı