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