Bu görüntülemeye özel alanlarda yapılan güncellemeler bu sayfada sağlanır.
Sistem süslemeleri
Android 10, duvar kağıdı, gezinme çubuğu ve başlatıcı gibi belirli sistem süslemelerini göstermek için ikincil ekranların yapılandırılmasına destek ekler. Varsayılan olarak, birincil ekranda tüm sistem süslemeleri gösterilir. İkincil ekranlarda ise isteğe bağlı olarak etkinleştirilen süslemeler gösterilir. Giriş yöntemi düzenleyicisi (IME) desteğini diğer sistem süslemelerinden ayrı olarak ayarlayabilirsiniz.
Belirli bir ekranda sistem süslemeleri için destek eklemek veya DisplayWindowSettings#setShouldShowSystemDecorsLocked()
içinde varsayılan bir değer sağlamak için DisplayWindowSettings#setShouldShowSystemDecorsLocked()
kullanın./data/system/display_settings.xml
Örnekler için Ekran penceresi ayarları başlıklı makaleye bakın.
Uygulama
DisplayWindowSettings#setShouldShowSystemDecorsLocked()
, test için
WindowManager#setShouldShowSystemDecors()
içinde de kullanıma sunulur. Bu yöntemi, sistem dekorlarını etkinleştirmek amacıyla tetiklemek, daha önce eksik olan dekor pencerelerini eklemez veya daha önce mevcut olanları kaldırmaz. Çoğu durumda, sistem süslemeleri desteğindeki değişiklik yalnızca cihaz yeniden başlatıldıktan sonra tam olarak geçerli olur.
WindowManager kod tabanında sistem süslemelerinin desteklenip desteklenmediği genellikle DisplayContent#supportsSystemDecorations()
ile kontrol edilir. Harici hizmetlerin (ör. gezinme çubuğunun gösterilip gösterilmeyeceğini kontrol etmek için kullanılan Sistem Kullanıcı Arayüzü) kontrolü için ise WindowManager#shouldShowSystemDecors()
kullanılır.
Bu ayarla 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, gezinme çubuğu için yalnızca sistem dekor penceresi desteği ekler. Varsayılan olarak gezinme çubuğunda Geri ve Ana Sayfa seçenekleri gösterilir. Bu yalnızca hedef ekran sistem süslemelerini destekliyorsa dahil edilir (bkz. DisplayWindowSettings
).
Durum çubuğu, Bildirim Gölgesi, Hızlı Ayarlar ve Kilit Ekranı'nı da içerdiğinden 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 Kullanılanlar sistem penceresi ikincil ekranlarda desteklenmez. Android 10'da AOSP, yalnızca varsayılan ekranda Son Arananlar'ı gösterir ve tüm ekranlardaki etkinlikleri içerir. Son Kullanılanlar'dan başlatılan, ikincil ekranda bulunan bir etkinlik varsayılan olarak bu ekranda ön plana getirilir. 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 ekran
- Çalışma zamanında kaldırılan ekran
Sistem Kullanıcı Arayüzü, WindowManager'dan önce bir ekranın eklendiğini algıladığında yarış durumu oluşturur. Bunu önlemek için DisplayManager.DisplayListener
etkinliklerine abone olmak yerine bir ekran eklendiğinde WindowManager'dan System UI'ya özel bir geri çağırma işlevi uygulayabilirsiniz. Referans uygulama için CommandQueue.Callbacks#onDisplayAddSystemDecorations
(gezinme çubuğu desteği) ve WallpaperManagerInternal#onDisplayAddSystemDecorations
(duvar kağıtları) bölümlerine bakın.
Ayrıca Android 10 aşağıdaki güncellemeleri 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.
Launcher
Android 10'da, sistem süslemelerini destekleyecek şekilde yapılandırılan her ekranda, varsayılan olarak WindowConfiguration#ACTIVITY_TYPE_HOME
türünde başlatıcı etkinlikleri için özel bir ana ekran yığını bulunur. Her ekranda başlatıcı etkinliğinin ayrı bir örneği kullanılır:
1. şekil. 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 amaç filtrelerinde SECONDARY_HOME
kategorisini kullanıma sundu. Bu etkinliğin örnekleri, sistem dekorasyonlarını destekleyen tüm ekranlarda (ekran başına bir tane) kullanılır.
<activity> ... <intent-filter> <category android:name="android.intent.category.SECONDARY_HOME" /> ... </intent-filter> </activity>
Etkinlik, birden fazla örneği engelleyemeyen 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, ana ekranın başlatıldığı ekrana bağlı olarak istenen bileşen ve amaç RootActivityContainer#startHomeOnDisplay()
otomatik olarak seçilir. RootActivityContainer#resolveSecondaryHomeActivity()
Şu anda 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 etkinlikler için geçerli olan kısıtlamalara ek olarak, kötü amaçlı bir uygulamanın Sistem süslemeleri etkin şekilde sanal ekran oluşturup yüzeyden kullanıcıya ait hassas bilgileri okumasını önlemek için başlatıcı yalnızca sisteme ait 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 duvar kağıtları ikincil ekranlarda desteklenir:
Şekil 2. İç (üstte) ve dış ekranlarda (altta) animasyonlu duvar kağıdı.
Geliştiriciler,
WallpaperInfo
XML tanımında
android:supportsMultipleDisplays="true"
sağlayarak duvar kağıdı özelliği desteğini beyan edebilir. Duvar kağıdı geliştiricilerin de WallpaperService.Engine#getDisplayContext()
içinde öğeleri ekran bağlamını kullanarak yüklemesi beklenir.
Çerçeve, her ekran için bir WallpaperService.Engine
örnek
oluşturur. Bu nedenle, her motorun kendi yüzeyi ve ekran bağlamı vardır. Geliştiricinin, her motorun VSync'e uygun şekilde farklı kare hızlarında bağımsız olarak çizim yapabildiğinden emin olması gerekir.
Tek tek ekranlar için duvar kağıdı seçme
Android 10, tek tek ekranlar için duvar kağıdı seçme konusunda doğrudan platform desteği sağlamaz. Bunu yapmak için, duvar kağıdı ayarlarının ekran başına kalıcı olması için sabit 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'da DisplayInfo.mAddress
eklendi. Bu, fiziksel ekranlar için sabit tanımlayıcılar içerir ve gelecekte tam bir uygulama için kullanılabilir. Maalesef Android 10 için bu mantığı uygulamak artık çok geç. Önerilen çözüm:
- Duvar kağıtlarını ayarlamak için
WallpaperManager
sınıfını kullanın.WallpaperManager
, birContext
nesnesinden elde edilir ve herContext
nesnesinde ilgili ekranla (Context#getDisplay()/getDisplayId()
) ilgili bilgiler bulunur. Bu nedenle, yeni yöntemler eklemeden birWallpaperManager
örneğindendisplayId
elde edebilirsiniz. - Çerçeve tarafında,
Context
nesnesinden elde edilendisplayId
öğesini kullanın ve bunu statik bir tanımlayıcıyla (ör. fiziksel bir ekranın bağlantı noktası) eşleyin. Seçilen duvar kağıdını kalıcı hale getirmek için statik tanımlayıcıyı kullanın.
Bu geçici çözüm, duvar kağıdı seçiciler için mevcut uygulamaları kullanır. Belirli bir ekranda açılmışsa ve doğru bağlamı kullanıyorsa duvar kağıdı ayarlama çağrısı yapıldığında sistem ekranı otomatik olarak tanımlayabilir.
Mevcut ekran dışında bir ekran için duvar kağıdı ayarlamanız gerekirse hedef ekran için yeni bir Context
nesnesi oluşturun (Context#createDisplayContext
) ve bu ekrandan WallpaperManager
örneğini alın.
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 süslemeleri desteği etkinleştirilmiş sanal bir ekran oluşturup yüzeyden kullanıcıya ait hassas bilgileri (ör. kişisel bir fotoğraf) okuyabilmesiyle 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, oluşturma sırasında her DisplayContent
nesnesi için duvar kağıdı denetleyicileri oluşturulur.
Herkese açık WallpaperManager
yöntemi uygulamalarından bazıları (ör. WallpaperManager#getDesiredMinimumWidth()
), ilgili gösterimler için bilgi hesaplayıp 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 uygun 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ığı.