Bağlı ekranlar, pencereli görüntüleme deneyimini standart telefonlara da taşıyarak kullanıcıların mobil cihazlarından büyük ekranlara erişmesini sağlar. Bu özellik, uygulama etkileşimi ve kullanıcı verimliliği açısından yeni olanaklar sunar.
Masaüstü pencereli görüntülemenin tüm benzersiz özellikleri, bağlı ekranlar için geçerlidir. Bir telefonu ekrana bağladığınızda telefonun durumu değişmez ve bağlı ekranda boş bir masaüstü oturumu başlatılır. Cihaz ve ekran, her ekrana özel uygulamaların bulunduğu iki ayrı sistem olarak çalışır.
Tablet gibi pencereli görüntüleme özelliğinin etkin olduğu bir cihazı harici bir monitöre bağlarsanız masaüstü oturumu her iki ekrana da yayılır. İki ekran daha sonra tek bir sürekli sistem olarak çalışır. Bu kurulum, pencerelerin, içeriğin ve imlecin iki ekran arasında serbestçe hareket etmesine olanak tanır.
Bağlı ekranların etkili bir şekilde desteklenmesi için uygulamanızın tasarımının ve uygulanmasının çeşitli yönlerine dikkat etmeniz gerekir. Aşağıdaki en iyi uygulamalar, sorunsuz ve verimli bir kullanıcı deneyimi sağlar.
Dinamik ekran değişikliklerini işleme
Birçok uygulama, Display nesnesinin ve özelliklerinin uygulamanın yaşam döngüsü boyunca değişmeyeceği varsayımıyla oluşturulur. Ancak bir kullanıcı harici bir monitörü bağladığında veya bağlantısını kestiğinde, hatta bir uygulama penceresini ekranlar arasında taşıdığında uygulamanızın bağlamı ya da penceresiyle ilişkili temel Display nesnesi değişebilir. Ekranın boyut, çözünürlük, yenileme hızı, HDR desteği ve yoğunluk gibi özellikleri farklı olabilir. Değerleri telefonun ekranına göre sabit kodlarsanız düzenleriniz büyük olasılıkla harici bir ekranda bozulur.
Harici ekranların piksel yoğunlukları da çok farklı olabilir. Uygulamanızın yoğunluk değişikliklerine doğru şekilde yanıt verdiğinden emin olmanız gerekir. Bunun için düzenlerde yoğunluktan bağımsız pikseller (dp) kullanmanız, yoğunluğa özel kaynaklar sağlamanız ve kullanıcı arayüzünüzün uygun şekilde ölçeklenmesini sağlamanız gerekir.
Ekranın bağlantısı kesildiğinde harici ekranda bir etkinlik çalışıyorsa sistem bu etkinliği birincil ekrana taşır. Taşıma işlemi, ekran boyutu ve yoğunluk değişiklikleri gibi yapılandırma değişikliklerini tetikler. Bu değişiklikler, etkinliğin yeniden oluşturulmasına neden olabilir. Uygulamanız, veri kaybını veya kafa karıştırıcı bir kullanıcı deneyimini önlemek için kullanıcı arayüzü durumunu kaydedip geri yükleyerek yapılandırma değişikliğini işlemelidir.
Doğru bağlamı kullanma
Çok ekranlı ortamlarda doğru bağlamı kullanmak çok önemlidir. Kaynaklara erişilirken etkinlik bağlamı (görüntülenen) uygulama bağlamından (görüntülenmeyen) farklıdır.
Etkinlik bağlamı, ekranla ilgili bilgiler içerir ve her zaman etkinliğin göründüğü ekran alanına göre ayarlanır. Bu sayede, uygulamanızın ekran yoğunluğu veya pencere metrikleri hakkında doğru bilgileri alabilirsiniz. Geçerli pencere veya ekran hakkında bilgi almak için her zaman etkinlik bağlamını (veya başka bir kullanıcı arayüzü tabanlı bağlamı) kullanın. Bu durum, bağlamdaki bilgileri kullanan bazı sistem API'lerini de etkiler.
Jetpack Compose'da CompositionLocal nesnelerini (ör. LocalConfiguration.current ve LocalDensity.current) kullanarak ekrana özgü bilgilere erişebilirsiniz. Bir etkinlik veya pencere ekranlar arasında taşındığında cihaz yapılandırması değişir ve yeni ekran metrikleriyle yeniden oluşturma tetiklenir. CompositionLocal nesneleri, kullanıcı arayüzünüzün sorunsuz bir şekilde uyarlanmasını sağlar.
Ekran bilgilerini alma
Görüntü boyutu, yoğunluk veya işaretler gibi bilgileri almak için Display sınıfını kullanabilirsiniz. Kullanılabilir ekranları almak için DisplayManager sisteme ait hizmeti kullanın. Harici ekranları belirlemek için genellikle yerleşik telefon veya tablet ekranı olan Display.DEFAULT_DISPLAY öğesini filtreleyin:
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()
// The default display is 0. External displays have other IDs.
val externalDisplays = displays.filter { it.displayId != Display.DEFAULT_DISPLAY }
Etkinlik başlatma ve yapılandırmayı yönetme
Bağlı ekranlar sayesinde uygulamalar, başlatıldığında veya başka bir etkinlik oluşturduğunda hangi ekranda çalışacağını belirleyebilir. Bu davranış, manifest dosyasında tanımlanan etkinlik başlangıç moduna ve etkinliği başlatan öğe tarafından ayarlanan amaç işaretlerine ve seçeneklerine bağlıdır.
Bir etkinlik ikincil ekrana taşındığında uygulamanızda bağlam güncellemesi, pencere yeniden boyutlandırma, yapılandırma ve kaynak değişiklikleri yaşanabilir. Etkinlik, yapılandırma değişikliğini işlerse onConfigurationChanged() içinde bilgilendirilir. Aksi takdirde etkinlik yeniden başlatılır.
Bir etkinlik için seçilen başlangıç modu birden fazla örneğe izin veriyorsa ikincil bir ekranda başlatma işlemi, etkinliğin yeni bir örneğini oluşturabilir. Her iki etkinlik de aynı anda devam ettirilir. Bu durum, belirli çoklu görev senaryolarında faydalı olabilir.
ActivityOptions kullanarak belirli bir ekranda etkinlik başlatabilirsiniz. launchDisplayId için Android 8 (API düzeyi 26) veya sonraki sürümlerin gerektiğini unutmayın.
// Get DisplayManager and find the first external display.
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val externalDisplayId = displayManager.displays
.firstOrNull { it.displayId != Display.DEFAULT_DISPLAY }
?.displayId
// If an external display is found, launch the activity on it.
if (externalDisplayId != null) {
val intent = Intent(this, MySecondaryActivity::class.java)
val options = ActivityOptions.makeBasic()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
options.launchDisplayId = externalDisplayId
}
startActivity(intent, options.toBundle())
} else {
// Optionally, handle the case where no external display is connected.
}
Cihaz izin verilenler listelerinden kaçının
Uygulamalar bazen izin verilenler listesi aracılığıyla veya BUILD.MODEL ve yerleşik görüntü boyutunu kontrol ederek büyük ekran kullanıcı arayüzünü ve özelliklerini belirli cihazlarla kısıtlar. Bu yaklaşım, bağlı ekranlar için etkili değildir. Çünkü neredeyse tüm cihazlar büyük bir ekrana bağlanabilir ve harici bir ekran bağlandığında cihaz modeli değişmez.
İzin verilenler listelerini kullanmak veya BUILD.MODEL ile yerleşik görüntü boyutunu kontrol etmek yerine, kullanıcı arayüzüyle ilgili kararlar vermek için çalışma zamanında pencere metriklerini veya cihaz özelliklerini kontrol edin. Çeşitli ekran boyutları ve yoğunlukları için duyarlı ve uyarlanabilir düzenler oluşturmak üzere Jetpack WindowManager API'lerini veya pencere boyutu sınıflarını kullanın.
Harici çevre birimlerini destekleme
Kullanıcılar harici bir ekrana bağlandığında genellikle masaüstü benzeri bir ortam oluşturur. Bu durumda genellikle harici klavye, fare, izleme dörtgeni, web kamerası, mikrofon ve hoparlör kullanılır. Uygulamanızın bu çevre birimleriyle sorunsuz bir şekilde çalıştığından emin olmanız gerekir. Klavye kısayollarını kullanma, fare işaretçisi etkileşimlerini yönetme, harici kameraları veya mikrofonları doğru şekilde destekleme ve ses çıkışı yönlendirmesine uyma bu kapsamdadır. Daha fazla bilgi için Büyük ekranlarda giriş uyumluluğu başlıklı makaleyi inceleyin.
Kullanıcı üretkenliğini artırma
Bağlı ekranlar, kullanıcı üretkenliğini artırmak için önemli bir fırsat sunar. Artık masaüstü uygulamalarıyla karşılaştırılabilir deneyimler sunan mobil uygulamalar oluşturmak için gereken araçlara sahipsiniz. Kullanıcı üretkenliğini artırmak için aşağıdaki özellikleri uygulamayı düşünebilirsiniz:
- Kullanıcıların aynı uygulamanın birden fazla örneğini açmasına izin verin. Bu özellik, belgeleri karşılaştırma, farklı görüşmeleri yönetme veya birden fazla dosyayı aynı anda görüntüleme gibi görevler için çok değerlidir.
- Kullanıcıların sürükle ve bırak özelliğiyle uygulamanızda ve uygulamanızın dışında zengin veriler paylaşmasına olanak tanıyın.
- Güçlü bir durum yönetimi sistemi uygulayarak kullanıcıların yapılandırma değişiklikleri sırasında iş akışlarını korumalarına yardımcı olun.
Bu yönergeleri uygulayarak ve sağlanan kod örneklerinden yararlanarak, bağlı ekranlara sorunsuz bir şekilde uyum sağlayan uygulamalar oluşturabilir, böylece kullanıcılara daha zengin ve verimli bir deneyim sunabilirsiniz.