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çindisplayId
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:
- Duvar kağıtlarını ayarlamak için
WallpaperManager
API'yi kullanın. WallpaperManager
,Context
nesnesinden elde edilir ve herContext
nesnesi, karşılık gelen görüntülemeyle (Context#getDisplay()/getDisplayId()
) ilgili bilgilere sahiptir. Bu nedenle, yeni yöntemler eklemeden birWallpaperManager
örneğindendisplayId
elde edebilirsiniz.- Çerçeve tarafında,
Context
nesnesinden elde edilendisplayId
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ığı