Katlanabilir ve çok ekranlı cihazlara yönelik uygulamalar
Genel olarak uygulamalar, statik tanımlayıcılara veya bazı gösterim 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ı, işlem yapmanın 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 ekrana erişimin 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.
Sistem ekrana sahipse sistem pencere ekleyebilir ve etkinlik başlatabilir.
Ayrıca, bir ekrana yerleştirilen öğeler her zaman bu ekrana erişebilir. Sahip bir ekranda etkinlik başlattığında 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 etkinliklerine izin verilir ve arayanın ACTIVITY_EMBEDDING izni olmalıdır.
Daha fazla bilgi için aşağıdaki konulara bakın:
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 bir 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 kullanıp identifier="1" değerini DisplayWindowSettings#IDENTIFIER_PORT ile eşleşecek şekilde ayarlamak ve ardından 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 aşağıdaki konulara bakın:
Ekranları yansıtma ve sunma görevleri arasında geçiş yapma
Android 17 ve sonraki sürümlerde DisplayManager, bir ekranın çalışma zamanında yansıtma ve görevler arasında geçiş yapıp yapmayacağını kontrol etmek için FLAG_ALLOWS_CONTENT_MODE_SWITCH işaretini kullanır. Bu işaret, varsayılan olarak harici ekranlarda etkin, diğer tüm ekranlarda ise devre dışıdır.
FLAG_ALLOWS_CONTENT_MODE_SWITCH mevcut olduğunda DisplayManager, görevlerin yansıtılıp yansıtılmayacağını veya barındırılıp barındırılmayacağını belirlemek için android.provider.Settings.Secure.MIRROR_BUILT_IN_DISPLAY güvenli ayarını izler. Bu varsayılan mantık olsa da
OEM'ler bu davranışı özelleştirebilir.
Topolojiyi ve işaretçi hareketini görüntüleme
Android 17 ve sonraki sürümlerde, ekran topolojisi ekranların göreli konumlarını tanımlar ve fare işaretçisinin hareketini topolojideki belirli ekran grubuyla kısıtlar.
WindowManager, topolojiye bir ekran eklemeye karar verir ve DisplayManagerInternal.onDisplayBelongToTopologyChanged işlevini çağırır. DisplayManager
ekranı eklemeden önce DisplayTopologyCoordinator.isDisplayAllowedInTopology kontrolü yapar. Varsayılan olarak, yerel ekranlar görevleri barındırabiliyorsa sistem bunları ekler.
Görevleri barındırabilecek birden fazla herkese açık ekran varsa varsayılan ekranın dahil edilip edilmeyeceği kararı, shouldIncludeDefaultDisplayInTopology öğesine iletilen DisplayTopologyCoordinator boole sağlayıcısı tarafından verilir. Varsayılan ekran, görevleri barındırabilen tek herkese açık ekran ise her zaman topolojide yer alır. AOSP'de, boolean sağlayıcı yalnızca varsayılan ekran masaüstü pencereli görüntülemeyi destekliyorsa veya güvenli ayar Settings.Secure.INCLUDE_DEFAULT_DISPLAY_IN_TOPOLOGY true ise true değerini döndürür.
Uygulamalar, DisplayManager.getDisplayTopology kullanarak mevcut topolojiyi sorgular ve DisplayManager.registerTopologyListener ile bir dinleyici kaydederek topolojideki değişikliklere tepki verir.