Katlanabilir ve çok ekranlı cihazlara yönelik uygulamalar
Genel olarak uygulamalar, statik tanımlayıcılara veya bazı görüntüleme kimliklerine bağlı mantığa güvenmemelidir. Çoğu durumda uygulamalar yeniden boyutlandırılmalı ve farklı ekranlarda çalışmalıdır. Uygulamaların nereye yerleştirileceğini sistem kontrol etmelidir. Örneğin, katlanabilir cihazlar için yeni ve benzersiz bir deneyim oluşturmak ve cihaz katlandığında harici ekranda özel bir uygulama başlatmak.
Bu durumda SystemUI (veya başka bir sistem bileşeni), katlama yerini algılamalı, bir işlem gerçekleştirmenin uygun olup olmadığını belirlemeli, ardından hedef etkinliği başlatmalı ve başlatma hedefi olarak harici bir ekran kimliği belirtmelidir. Uygulamalar bu işlemi algılamamalı, buna karşılık herhangi bir işlem yapmamalı ve ardından belirli bir ekranda başlatma işlemini gerçekleştirmelidir. Başka bir deyişle, bir cihazda çalışan bir özelliğin diğer cihazlarda da çalışacağını varsaymayın. Kısacası, cihaza özgü kod, parçalanmayı artırır.
Ekranlara erişimi kısıtlama
Cihaz yapılandırması, bir veya daha fazla ekranın erişiminin kısıtlanmasını gerektiriyorsa bu tür ekranları özel olarak belirlemek için Display#FLAG_PRIVATE
işaretinin kullanılması önerilir. Bu işlem, sahibi hariç herkesin ekrana içerik eklemesini kısıtlar. Etkinlik başlatma veya pencere ekleme girişimleri yalnızca sahibi tarafından yapılabilir. Aksi takdirde SecurityException
hatasıyla karşılaşılır.
Ekran sisteme aitse sistem, pencere ekleyebilir ve etkinlik başlatabilir.
Ayrıca, bir ekrana yerleştirilen öğeler her zaman o ekrana erişebilir. Sahip bir ekranda etkinlik başlatırsa bu etkinlik, aynı ekranda başka etkinlikler başlatabilir. Bu nedenle, erişimi kısıtlamak ve yalnızca güvenilir uygulamalara izin vermek sahibin sorumluluğundadır.
Ayrıca, herhangi bir uygulama kullanıcıya görünür kılmadan sanal ekran oluşturabildiğinden sanal ekranlara daha fazla kısıtlama eklenir. Sanal ekran sisteme ait değilse yalnızca allowEmbedded
ile ilgili etkinliklere izin verilir ve arayanın ACTIVITY_EMBEDDING
izni olmalıdır.
Daha fazla bilgi için bkz.
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
ActivityDisplay#isUidPresent()
DisplayManagerService#isUidPresentOnDisplay()
Etkinlik başlatmalarını koşullu olarak kontrol etmek için LaunchParamsController
kullanın. Bu, tüm etkinlik başlatmalarını durdurur ve bir sistem bileşeninin başlatma için kullanılan parametreleri değiştirmesine olanak tanır. Bu özellik system_server
'da kullanılabilir.
Görüntü pencere ayarlarını ve sistem süslemelerini yapılandırma
Sistem süslemeleri, DisplayWindowSettings
içinde ekran başına yapılandırılabilir. Bir cihaz uygulaması, /data/system/display_settings.xml
içinde varsayılan yapılandırma sağlayabilir.
Bu değer, sistem süslemelerinin (başlatıcı, duvar kağıdı, gezinme çubuğu ve diğer süsleme pencereleri) ve IME'nin ekranda görünüp görünmeyeceğini belirler.
Ayrıntılı bilgi için DisplayWindowSettings#shouldShowSystemDecorsLocked()
ve DisplayWindowSettings#shouldShowImeLocked()
başlıklı makaleleri inceleyin.
Ekranı tanımlamak için benzersiz bir kimlik (varsayılan olarak DisplayInfo#uniqueId
kullanılır) veya donanım ekranları için fiziksel bağlantı noktası kimliği kullanın (bkz. DisplayInfo#address
).
Örneğin, aşağıdaki ekran yapılandırması örneği, sistem süslemelerini ve IME'yi simüle edilmiş bir ekranda etkinleştirir:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="0" /> <display name="overlay:1" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
Yukarıdaki örnekte, ad özelliğinde ekran tanımlaması için uniqueId
kullanılıyor. Simüle edilmiş bir ekran için bu overlay:1
olur.
Yerleşik bir ekran için örnek değer "local:45354385242535243453"
olabilir.
Diğer bir seçenek de donanım bağlantı noktası bilgilerini kullanmak ve identifier="1"
değerini DisplayWindowSettings#IDENTIFIER_PORT
ile eşleşecek şekilde ayarlayıp adı "port:<port_id>"
biçimini kullanacak şekilde güncellemektir:
<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?> <display-settings> <config identifier="1" /> <display name="port:12345" shouldShowSystemDecors="true" shouldShowIme="true" /> </display-settings>
Ayrıntılar için Statik ekran tanımlayıcıları başlıklı makaleyi inceleyin.
Daha fazla bilgi için bkz.