Sistem süslemeleri desteği

Görüntülü reklamlara özgü bu alanlarda yapılan güncellemeler aşağıda verilmiştir:

Sistem süslemeleri

Android 10, ikincil ekranları duvar kağıdı, gezinme çubuğu ve başlatıcı gibi belirli sistem süslemelerini gösterecek şekilde yapılandırma desteği ekler. Varsayılan olarak birincil ekranda tüm sistem süslemeleri, ikincil ekranlarda ise isteğe bağlı olarak etkinleştirilen süslemeler gösterilir. Giriş Yöntemi Düzenleyici (IME) desteği, diğer sistem süslemelerinden ayrı olarak ayarlanabilir.

Belirli bir ekranda sistem süslemeleri için destek eklemek veya /data/system/display_settings.xml öğesinde varsayılan bir değer sağlamak için DisplayWindowSettings#setShouldShowSystemDecorsLocked() kullanın. Örnekler için Görüntüleme penceresi ayarları başlıklı makaleyi inceleyin.

Uygulama

DisplayWindowSettings#setShouldShowSystemDecorsLocked(), test için WindowManager#setShouldShowSystemDecors() içinde de gösterilir. Sistem dekorlarını etkinleştirmek amacıyla bu yöntemin tetiklenmesi, daha önce eksik olan dekor pencerelerini eklemez veya daha önce mevcut olanları kaldırmaz. Çoğu durumda, sistem dekorasyonu desteği değişikliği yalnızca cihaz yeniden başlatıldıktan sonra tam olarak geçerli olur.

WindowManager kod tabanındaki sistem süslemelerinin desteklenmesi için yapılan kontroller genellikle DisplayContent#supportsSystemDecorations() üzerinden yapılır. Harici hizmetlerle ilgili kontroller (ör. gezinme çubuğunun gösterilip gösterilmeyeceğini kontrol etmek için sistem kullanıcı arayüzü) ise WindowManager#shouldShowSystemDecors() kullanılır. Bu ayar tarafından nelerin kontrol edildiğini anlamak için bu yöntemlerin çağrı noktalarını inceleyin.

Sistem kullanıcı arayüzü dekor pencereleri

Android 10, etkinlikler ve uygulamalar arasında gezinmek için gezinme çubuğu gerekli olduğundan yalnızca gezinme çubuğu için sistem dekorasyonu penceresi desteği ekler. Gezinme çubuğunda varsayılan olarak Geri ve Ana Sayfa kolaylıkları gösterilir. Bu yalnızca hedef ekran sistem süslemelerini destekliyorsa dahil edilir (bkz. DisplayWindowSettings).

Durum çubuğu , bildirim gölgesini, hızlı ayarları ve kilit ekranını da içerdiği için 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 Aramalar sistem penceresi ikincil ekranlarda desteklenmez. Android 10'da AOSP, Son Aramalar'ı yalnızca varsayılan ekranda gösterir ve tüm ekranlardaki etkinlikleri içerir. Son etkinliklerden başlatıldığında, ikincil ekranda olan bir etkinlik varsayılan olarak o ekranda öne getirilir. Bu yaklaşımın bilinen bazı sorunları vardır. Örneğin, uygulamalar diğer ekranlarda göründüğünde hemen güncelleme yapılmaması gibi.

Uygulama

Cihaz üreticileri, ek Sistem Kullanıcı Arayüzü özelliklerini uygulamak için 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 birden fazla ekranı başlatma
  • Çalışma zamanında eklenen ekran
  • Çalışma zamanında kaldırılan reklam

Sistem kullanıcı arayüzü, WindowManager'dan önce bir ekranın eklendiğini algıladığında bir yarış koşulu oluşturur. Bu durum, DisplayManager.DisplayListener etkinliklerine abone olmak yerine bir ekran eklendiğinde WindowManager'dan Sistem UI'ye özel bir geri çağırma uygulanarak önlenebilir. Referans uygulama için gezinme çubuğu desteği için CommandQueue.Callbacks#onDisplayReady'e, duvar kağıtları için WallpaperManagerInternal#onDisplayReady'e bakın.

Ayrıca Android 10 şu güncellemeleri de sunar:

  • 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 CarStatusBar bölümüne 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.

Roketatar

Android 10'da, sistem süslemelerini desteklemek için yapılandırılmış her ekranda varsayılan olarak WindowConfiguration#ACTIVITY_TYPE_HOME türüne sahip başlatıcı etkinlikleri için özel bir ana ekran yığını bulunur. Her ekran, ayrı bir başlatıcı etkinliği örneği 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ı bir deneyim beklenir. Android 10, ikincil ekranlar için özel bir etkinlik sağlamak amacıyla intent filtrelerinde SECONDARY_HOME kategorisini kullanıma sunar. Bu etkinliğin örnekleri, sistem süslemelerini destekleyen tüm ekranlarda ekran başına bir tane olacak şekilde kullanılır.

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

Etkinlik, birden fazla örneği engellemeyen ve farklı ekran boyutlarına uyum sağlaması beklenen bir başlatma moduna sahip olmalıdır. 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(), geçerli olarak seçili olan başlatıcıya bağlı olarak başlatıcı etkinlik bileşenini arayan mantığı içerir ve gerekirse sistem varsayılanını kullanabilir (ActivityTaskManagerService#getSecondaryHomeIntent() bölümüne bakın).

Güvenlik kısıtlamaları

Kötü amaçlı bir uygulamanın sistem süslemeleri etkinleştirilmiş bir sanal ekran oluşturması ve yüzeyden kullanıcıya ait hassas bilgileri okuması ihtimalini önlemek için ikincil ekranlardaki etkinliklerle ilgili kısıtlamalara ek olarak başlatıcı yalnızca sistemin sahip olduğu sanal ekranlarda görünür. Başlatıcı, sistem dışı sanal ekranlarda içerik göstermez.

Duvar kağıtları

Android 10 (ve sonraki sürümler) cihazlarda duvar kağıtları ikincil ekranlarda desteklenir:

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

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 de öğeleri WallpaperService.Engine#getDisplayContext() içindeki görüntüleme bağlamını kullanarak yüklemeleri de beklenir.

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

Ekranlar için ayrı ayrı duvar kağıdı seçme

Android 10, ekranlar için ayrı ayrı duvar kağıdı seçme işlemine doğrudan platform desteği sağlamaz. Bunu yapmak için, ekran başına duvar kağıdı ayarlarını korumak üzere kararlı bir ekran tanımlayıcısı gerekir. Display#getDisplayId() dinamik olduğundan fiziksel bir ekranın yeniden başlatıldıktan sonra aynı kimliğe sahip olacağı garanti edilmez.

Ancak Android 10, fiziksel ekranlar için kararlı tanımlayıcıları içeren ve gelecekte tam uygulama için kullanılabilecek DisplayInfo.mAddress özelliğini ekledi. Maalesef Android 10'daki mantığı uygulamak için artık çok geç. Önerilen çözüm:

  1. Duvar kağıtlarını ayarlamak için WallpaperManager API'yi kullanın.
  2. WallpaperManager, Context nesnesinden elde edilir ve her Context nesnesi, karşılık gelen görüntülemeyle (Context#getDisplay()/getDisplayId()) ilgili bilgilere sahiptir. Bu nedenle, yeni yöntemler eklemeden bir WallpaperManager örneğinden displayId elde edebilirsiniz.
  3. Çerçeve tarafında, Context nesnesinden elde edilen displayId değerini kullanın ve statik bir tanımlayıcıyla (ör. fiziksel ekranın bağlantı noktası) eşleyin. Seçilen duvar kağıdını korumak 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 sistem, duvar kağıdı ayarlama çağrısı yaptığında ekranı otomatik olarak tanımlayabilir.

Mevcut ekran dışındaki bir ekran için duvar kağıdının ayarlanması gerekiyorsa hedef ekran (Context#createDisplayContext) için yeni bir Context nesnesi oluşturun ve söz konusu ekrandan WallpaperManager örneğini alın.

Güvenlik kısıtlamaları

Sistem, sanal ekranlarda kendisine ait olmayan duvar kağıtlarını göstermez. Bunun nedeni, kötü amaçlı bir uygulamanın sistem süsleme desteğinin etkin olduğu bir sanal ekran oluşturarak kullanıcıya ait hassas bilgileri (ör. kişisel fotoğraf) yüzeyden okuyabileceğiyle ilgili güvenlik endişesidir.

Uygulama

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

Herkese açık WallpaperManager yöntem uygulamalarından bazıları (WallpaperManager#getDesiredMinimumWidth() gibi), ilgili gösterimler için bilgi hesaplayıp sağlamak üzere güncellendi. WallpaperInfo#supportsMultipleDisplays() ve buna karşılık gelen bir kaynak özelliği eklendi. Böylece uygulama geliştiriciler, hangi duvar kağıtlarının birden fazla ekrana 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ı yedek mantığı