Sistem süslemeleri desteği

Bu görüntülemeye özgü alanlarda yapılan güncellemeler aşağıda sağlanmıştır:

Sistem süslemeleri

Android 10'a ikincil yapılandırma desteği eklendi duvar kağıdı, gezinme çubuğu ve arka plan rengi gibi belirli sistem süslemelerini ve başlatıcıyı kullanabilirsiniz. Varsayılan olarak, birincil ekran tüm sistem süslemelerini gösterir ve ikincil ekranlarda isteğe bağlı olarak etkinleştirilenler gösterilir. Giriş Yöntemi Düzenleyici desteği (IME), diğer sistem süslemelerinden ayrı olarak ayarlanabilir.

DisplayWindowSettings#setShouldShowSystemDecorsLocked() hesabını kullan belirli bir ekranda sistem süslemeleri için destek eklemek veya /data/system/display_settings.xml içinde varsayılan bir değerdir. Örneğin, Görüntüleme penceresi ayarları adlı makaleyi inceleyin.

Uygulama

DisplayWindowSettings#setShouldShowSystemDecorsLocked() ayrıca şuralarda da açığa çıktı: Test için WindowManager#setShouldShowSystemDecors(). Bu yöntemin tetiklenmesi dekore etmek amacıyla kullanılan süsleme pencereleri, Mevcut olanları kaldırmanızı öneririz. Çoğu zaman durumunda, sistem süslemesi desteği değişikliği ancak cihazı yeniden başlatmasını sağlayabilirsiniz.

WindowManager kod tabanındaki sistem süslemelerinin desteklenmesi için kontroller genellikle DisplayContent#supportsSystemDecorations() olur. harici hizmetleri (örneğin, sistem arayüzü) kontrol ederek gezinme çubuğunun gösterilmesi gerekir) WindowManager#shouldShowSystemDecors() kullanın. Bu ayarın neleri kontrol ettiğini anlamak için bu yöntemleri kullanabilirsiniz.

Sistem kullanıcı arayüzü dekor pencereleri

Android 10'a sistem dekoru penceresi desteği eklendi çünkü gezinme çubuğu çok önemli olduğundan yalnızca gezinme çubuğu ve etkinlikler arasında gezinmek için kullanın. Varsayılan olarak, gezinme çubuğunda Geri ve Ana Sayfa uygun ücretleri. Bu, yalnızca hedef ekranın şunları desteklemesi durumunda dahil edilir: (bkz. DisplayWindowSettings) sistem süslemeleridir.

Durum çubuğu daha karmaşık bir sistem penceresidir çünkü Bildirim Gölgesi, Hızlı Ayarlar ve Kilit Ekranı da yer alır. Android'de 10, durum çubuğu ikincil ekranlarda desteklenmez. Bu nedenle, bildirimler, ayarlar ve tam bir tuş koruyucu yalnızca birincil görüntülü reklam.

Genel Bakış/Son aramalar sistem penceresi, ikincil cihazlarda desteklenmez ekranları. Android 10'da AOSP, yalnızca varsayılan ekrandır ve tüm ekranlardaki etkinlikleri içerir. Şuradan başlatıldığında: Son kullanılanlar, ikincil ekranda yer alan bir etkinlik ayarlanmaz. Bu yaklaşımda, teknik ekiplerin Uygulamalar diğer ekranlarda göründüğünde hemen güncelleniyor.

Uygulama

Cihaz üreticileri, ek sistem kullanıcı arayüzü özelliklerini uygulamak için ekranların eklenmesini/kaldırılmasını dinleyen tek bir Sistem Kullanıcı Arayüzü bileşeni Uygun içerik sunduğundan emin olun.

Çoklu Ekranı (MD) destekleyen bir Sistem Kullanıcı Arayüzü bileşeni, şu durumlardan biridir:

  • Başlangıçta birden fazla ekran başlatma
  • Ekran çalışma zamanında eklendi
  • Çalışma zamanında ekran kaldırıldı

Sistem Kullanıcı Arayüzü, WindowManager'dan önce bir ekran eklendiğini algıladığında bir yarış durumudur. Bu, Abone olmak yerine bir ekran eklendiğinde WindowManager'dan Sistem kullanıcı arayüzüne DisplayManager.DisplayListener etkinlikleri. Referans olarak kullanabileceğiniz bir uygulama için gezinme çubuğu desteği için CommandQueue.Callbacks#onDisplayReady öğesine bakın ve duvar kağıtları için WallpaperManagerInternal#onDisplayReady.

Android 10 ayrıca şu güncellemeleri de sağlar:

  • Tüm işlevleri NavigationBarController sınıfı kontrol eder gezinme çubuklarına özgüdür.
  • Özelleştirilmiş bir gezinme çubuğunu görüntülemek için CarStatusBar sayfasına bakın.
  • TYPE_NAVIGATION_BAR artık tek bir kişiyle sınırlı değil görüntülenebilir ve her ekran başına kullanılabilir.
  • IWindowManager#hasNavigationBar(), değeri içerecek şekilde güncellendi Yalnızca sistem kullanıcı arayüzü için displayId parametresi.

Roketatar

Android 10'da her ekran, Android 10'da sistem süslemeleri, aşağıdaki türlerde başlatıcı etkinlikleri için özel bir ana ekran yığınına sahiptir Varsayılan olarak WindowConfiguration#ACTIVITY_TYPE_HOME. Her bir ekran başlatıcı etkinliğinin ayrı bir örneğini kullanır.

Şekil 1. Şunun için çoklu ekran başlatıcı örneği: platform/development/samples/MultiDisplay.

Mevcut başlatıcıların çoğu birden fazla örneği desteklemez ve optimize edilmez büyük ekran boyutları için kullanabilirsiniz. Ayrıca, farklı tür bir deneyim genellikle ikincil/harici ekranlarda görebilirsiniz. İkincil okula özel bir etkinlik sağlamak için Android 10'da SECONDARY_HOME kategorisi kullanıma sunuluyor filtrelerine dokunun. Bu etkinliğin örnekleri, sistemi destekleyen tüm ekranlarda kullanılır her ekran için bir tane olacak şekilde süslemeler.

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

Etkinlik, birden fazla işlemi engellemeyen bir başlatma moduna sahip olmalıdır. ve farklı ekran boyutlarına uyum sağlaması beklenir. Başlatma modu singleInstance veya singleTask olamaz.

Uygulama

Android 10'da, RootActivityContainer#startHomeOnDisplay() ekrana bağlı olarak istenen bileşeni ve amacı otomatik olarak seçer ana ekranın kullanıma sunulduğu yer. RootActivityContainer#resolveSecondaryHomeActivity(). Başlatıcı etkinlik bileşenini arama mantığını içerir. seçili başlatıcıyı kullanabilir ve gerekiyorsa sistem varsayılanını kullanabilir (bkz. ActivityTaskManagerService#getSecondaryHomeIntent()) tıklayın.

Güvenlik kısıtlamaları

İkincil ekranlardaki etkinliklere uygulanan kısıtlamalara ek olarak, kötü amaçlı bir uygulamanın etkin bir sanal ekran oluşturma ihtimalini önlemek için Sistem süslemeleri ve kullanıcı hassas bilgilerini yüzeyden okurken başlatıcı yalnızca görünür ve sisteme ait sanal ekranlarda da Başlatıcı şurada içerik göstermiyor: sistem dışı sanal ekranlar için de geçerlidir.

Duvar kağıtları

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

Şekil 2. Dahili (yukarıda) ve harici cihazlarda animasyonlu duvar kağıdı görüntülenir (aşağıda)

Geliştiriciler, aşağıdaki bilgilerle duvar kağıdı özelliği için destek verdiklerini beyan edebilirler: android:supportsMultipleDisplays="true" WallpaperInfo XML tanımı. Duvar kağıdı geliştiricileri öğelerin, görüntülü reklam bağlamını kullanarak yüklenmesi WallpaperService.Engine#getDisplayContext()

Çerçeve bir WallpaperService.Engine örneği oluşturur her bir motorun kendi yüzey ve görüntüleme bağlamı vardır. İlgili içeriği oluşturmak için kullanılan her bir motorun tek tek, rastgele girildiğinde ve farklı kare hızlarında (VSYNC'ye uygun şekilde) çalışır.

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

Android 10, duvar kağıdı seçmek için doğrudan platform desteği sağlamaz ayrı ayrı kontrol edebilirsiniz. Bunu başarmak için sabit bir ekran tanımlayıcı her ekranda geçerli duvar kağıdı ayarlarını korumak için gereklidir. Display#getDisplayId() dinamik olduğundan fiziksel ekran, yeniden başlatmadan sonra aynı kimliğe sahip olur.

Ancak Android 10'da DisplayInfo.mAddress eklendi. Fiziksel ekranlar için sabit tanımlayıcılar içeren ve daha yakından inceleyeceğiz. Maalesef mantığı uygulamak için çok geç Android 10 için Önerilen çözüm:

  1. Duvar kağıtlarını ayarlamak için WallpaperManager API'sini kullanın.
  2. WallpaperManager, Context öğesinden alındı ve her Context nesnesi, karşılık gelen bu nesneye karşılık gelen ekran (Context#getDisplay()/getDisplayId()). Dolayısıyla, bir WallpaperManager örneğinden displayId alın yapmanız gerekmez.
  3. Çerçeve tarafında, birdisplayId Context nesnesini tanımlayın ve bunu statik bir tanımlayıcıyla (örneğin, fiziksel bir görüntü). 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çicilere ilişkin mevcut uygulamaları kullanır. Eğer açıldığında ve doğru bağlamı kullandığında, çağrısı yapıldığında sistem, ekranı otomatik olarak tanıyabilir.

Geçerli ekran dışındaki bir ekran için duvar kağıdının ayarlanması gerekiyorsa ardından hedef ekran için yeni bir Context nesnesi oluşturun (Context#createDisplayContext) ve WallpaperManager örneği.

Güvenlik kısıtlamaları

Sistem, sahibi olmadığı sanal ekranlarda duvar kağıtları göstermez. Bunun nedeni, kötü amaçlı bir uygulamanın sanal bir güvenlik açığı oluşturabileceği etkin sistem süslemeleri desteğine sahip bir ekran ve kullanıcılara duyarlı bir yüzeyden alınan bilgiler (kişisel bir fotoğraf gibi).

Uygulama

Android 10'da IWallpaperConnection#attachEngine() ve IWallpaperService#attach() arayüzleri, displayId parametresini kullanarak görüntülü reklam başına bağlantı oluşturabilirsiniz. WallpaperManagerService.DisplayConnector, ekran başına bir değeri içerir duvar kağıdı motoru ve bağlantısı. WindowManager'da duvar kağıdı denetleyicileri yerine, yapımdaki her DisplayContent nesne için oluşturulur Tüm ekranlar için tek bir WallpaperController.

Herkese açık WallpaperManager yöntemi uygulamalarından bazıları (örneğin, WallpaperManager#getDesiredMinimumWidth()) işlem yapmak için güncellendi ve ilgili ekranlar hakkında bilgi sağlar. WallpaperInfo#supportsMultipleDisplays() ve karşılık gelen uygulama geliştiricilerin hangi duvar kağıtları birden fazla ekrana hazır.

Varsayılan ekranda gösterilen duvar kağıdı hizmeti birden fazla ekran görürseniz sistem, ikincil ekranda varsayılan duvar kağıdını gösterir. görüntüler.

Şekil 3. İkincil ekranlar için duvar kağıdı yedek mantığı