Sistem süslemelerini destekleme

Bu ekrana özgü alanlarda yapılan güncellemeler bu sayfada sağlanır.

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ğini diğer sistem süslemelerinden ayrı olarak ayarlayabilirsiniz.

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() öğesini kullanın. Örnekler için Görüntüleme penceresi ayarları bölümüne bakın.

Uygulama

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

WindowManager kod tabanında 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 gerekli olan gezinme çubuğuna yalnızca sistem dekor 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 (DisplayWindowSettings bölümüne bakın).

Durum çubuğu, Bildirim Gölgesi, 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 çı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

Cihaz üreticileri, ek Sistem Kullanıcı Arayüzü özelliklerini uygulamak için ekranların eklenmesini veya 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 görüntü
  • Çalışma zamanında kaldırılan ekran

Sistem kullanıcı arayüzü, WindowManager'dan önce bir ekranın eklendiğini algıladığında bir yarış koşulu oluşturur. DisplayManager.DisplayListener etkinliklerine abone olmak yerine, ekran eklendiğinde WindowManager'dan Sistem Kullanıcı Arayüzü'ne özel bir geri çağırma uygulayarak bu sorunu önleyebilirsiniz. Referans uygulama için gezinme çubuğu desteğine CommandQueue.Callbacks#onDisplayAddSystemDecorations, duvar kağıtlarına ise WallpaperManagerInternal#onDisplayAddSystemDecorations 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.

Launcher

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 sundu. 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>

Etkinliğin, birden fazla ö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 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ü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, WallpaperService.Engine#getDisplayContext()'te ekran bağlamını kullanarak öğeleri yüklemesi 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'e 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 için mantığı uygulamak için çok geç. Önerilen çözüm:

  1. Duvar kağıtlarını ayarlamak için WallpaperManager sınıfını kullanın.

    WallpaperManager, bir Context nesnesinden elde edilir ve her Context nesnesi, ilgili ekran (Context#getDisplay()/getDisplayId()) hakkında bilgi içerir. Bu nedenle, yeni yöntemler eklemeden displayId'ı bir WallpaperManager örneğinden elde edebilirsiniz.

  2. Ç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ümde, duvar kağıdı seçicileri için mevcut uygulamalar kullanılı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ışında bir ekran için duvar kağıdı ayarlanması gerekiyorsa hedef ekran (Context#createDisplayContext) için yeni bir Context nesnesi oluşturun ve bu 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 hesaplamak ve sağlamak üzere güncellendi. WallpaperInfo#supportsMultipleDisplays() ve ilgili 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ığı.