Android N'de Çoklu Pencere: Geliştiricilerin Bundan En İyi Şekilde Yararlanmak için Bilmesi Gerekenler

Android N'deki çoklu pencere desteğinin geliştiriciler için ne anlama geldiğine ve bundan en iyi şekilde nasıl yararlanılabileceğine dair bir genel bakış sunuyoruz!

Çoklu pencere desteği Android N'de beklediğimiz güzel bir özellik ve uzun zamandır tüm cihazlarda kullanılabilir olmasını istediğimiz bir özellik. Ancak bunun keyifli bir deneyim olması için geliştiricilerin bunu doğru bir şekilde destekleyecek şekilde uygulamalarında bazı değişiklikler yapması gerekebilir.

Google I/O oturumlarından biri, geliştiricilerin yeni API'ler ve çoklu pencere desteğinin getirdiği sistem davranışı değişiklikleri hakkında bilgi edinmeleri içindi.

Oturum, Android ActivityManager'ın Teknik Baş Yöneticisi Wale Ogunwale tarafından sunuldu ve WindowManager çerçeve bileşenleri - kendisi ve ekibi, Android'deki çoklu pencereden sorumludur.

izleyebilirsiniz YouTube'da Çoklu Pencere modu oturumu, ancak burada oturumun genel bir özetini de sunuyoruz.

N, üç farklı çoklu pencere modunu sunar:
  • Bölünmüş ekran modu: Bu, varsayılan olarak kullanılabilen moddur. Adından da anlaşılacağı gibi iki uygulamayı yan yana açmanıza olanak sağlar.
  • Serbest biçim modu: Üreticiler bunu daha büyük cihazlarda etkinleştirebilir; bu da kullanıcıların bölünmüş ekran moduna ek olarak etkinlikleri serbestçe yeniden boyutlandırmasına olanak tanır.
  • Resim içinde resim modu: Android TV cihazlarını hedefleyen bu mod, kullanıcı diğer uygulamalarla etkileşimde bulunurken video oynatıcıların sabitlenmiş bir pencerede çalışması için tasarlanmıştır.
Android N Bölünmüş Ekran ModuAndroid N PiP Modu
Şunu belirtmekte yarar var. N'deki çoklu pencereyi daha önce ele almıştık ve mevcut sisteme bazı eleştiriler sunmuştuk. Bunu göz önünde bulundurarak, serbest biçim modunun resim içinde resim moduna biraz daha yaklaşmasını umuyoruz, çünkü bu mod tüm cihazlarda faydalı uygulamalara sahip olacaktır.
Uygulamalarınızda çoklu pencere desteğini etkinleştirmek basittir: Zaten N'yi hedefliyorsanız hiçbir şey yapmanıza gerek yoktur. Çoklu pencereyi devre dışı bırakmayı seçerseniz, bunu ayarlayarak yapabilirsiniz. android: resizeableActivity manifestinizdeki etkinlik özelliği. false. Bu, yalnızca gerçekten haklı olması durumunda yapılmalıdır, çünkü bu, uygulamanızın her zaman kötü bir şekilde öne çıkmasına neden olur. kullanıcı (veya başka bir uygulama) çoklu pencerede başlatmayı denese bile tam ekran modunda başlatma modu. Bir kök etkinliğin niteliklerinin, görev yığınındaki tüm etkinlikler için geçerli olduğunu unutmamak önemlidir. Başka bir deyişle, başka uygulamalar tarafından başlatılabilen bir etkinliğiniz varsa bunun çoklu pencere modunu desteklediğinden emin olun. çünkü diğer uygulamaların etkinliğinizi kullanarak yeni bir görev başlatacağını garanti edemezsiniz. Intent#FLAG_ACTIVITY_NEW_TASK .Resim içinde resim modu desteği, aracılığıyla açıkça bildirilmelidir. android: supportsPictureInPicture bağlanmak. Bu özelliğin göz ardı edildiğini unutmayın. android: resizeableActivity dır-dir. false .Yerleşim nitelikleri, serbest biçimli pencereler için varsayılan boyutları ve yerleşimi ayarlamak veya hem serbest biçimli hem de bölünmüş ekran modları için minimum genişlik veya yüksekliği belirlemek için kullanılabilir:
  • android: defaultWidth/android: defaultHeight: Etkinliğin varsayılan boyutları (serbest biçim modu).
  • android: gravity: etkinliğin başlangıç ​​konumu (serbest biçim modu).
  • android: minimalWidth/android: minimalHeight: Etkinliğin minimum boyutları (serbest biçimli ve bölünmüş ekran modları)
Bir kod örneğini şurada bulabilirsiniz. Google'ın Çok Pencereli Oyun Alanı örnek uygulaması GitHub'da: AndroidManifest.xml.
Çoklu pencere desteğinin kullanıma sunulmasıyla birlikte uygulamalarınızdaki birkaç şeyi tekrar kontrol ederek doğru çalıştıklarından emin olmanız gerekebilir.

Etkinlik yaşam döngüsünü anlama

The. etkinlik yaşam döngüsü çoklu pencere modunda değişmez: Android Etkinliği Temel Yaşam Döngüsü Bununla birlikte, etkinlik durumları arasındaki bazı ince farklar, normalde N'den önce fark etmeyeceğiniz istenmeyen davranışlarla sonuçlanabilir. Bunu bilmek önemlidir. Activity#onResume() Ve. Activity#onPause() uygulamanız odak kazandığında veya kaybettiğinde çağrılır, ancak görünür olmaya başladığında veya görünmeyi bıraktığında olması gerekmez. (Herhangi bir zamanda yalnızca bir uygulamaya odaklanılabileceğini unutmayın.) İçeriği sürekli olarak güncelleyen uygulamalar için (örneğin, video oynatma), içerik güncellemelerini başlatma ve durdurma işlemini burada gerçekleştirdiğinizden emin olun. Activity#onStart() Ve. Activity#onStop() yerine. Örneğin video uygulamaları için bunu yapmamak, oynatmanın yalnızca uygulamaya odaklanıldığında gerçekleşeceği anlamına gelirbu, çoklu pencere modunun amacını ortadan kaldırır. Android N Geliştirici Önizlemesi ilk başlatıldığında resmi YouTube uygulamasında da benzer bir sorun yaşandı.

Çalışma Zamanı Değişikliklerini Yönetme

Bir uygulama çoklu pencere moduna geçirildiğinde bazı cihaz yapılandırmaları değişecektir. Etkinliğinizin yeniden başlatılmasına izin verebilirsiniz (bu durumda. Parçaların tutulması Etkinliğinizin başlangıçta yoğun bir işlem gerçekleştirmesi gerekiyorsa) iyi bir fikir olabilir veya bunu tercih edebilirsiniz. konfigürasyon değişikliklerini açıkça ele alın yerine. Çoklu pencere moduna girerken veya çoklu pencere moduna girerken dört cihaz yapılandırması değişebilir: screenSize, smallestScreenSize, screenLayout Ve. orientation. Bakın. Android Geliştiricileri belgeleri her özellik hakkında daha fazla bilgi için, ancak şunu unutmayın. orientation bu durumda artık cihazın yönelimini ifade etmez. Bunun yerine yalnızca etkinliğinizin genişliğinin yüksekliğinden (manzara) daha mı büyük olduğunu veya değil (portre). Etkinliğinizin bu değişiklikleri ele alacağını beyan etmek manifestten yapılabilir:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Bunun, aslında bu değişiklikleri halletmeniz gerekeceği anlamına geldiğini unutmayın. Activity#onConfigurationChanged(), görünümleri manuel olarak güncelleyerek veya bazı kaynakları yeniden yükleyerek.

Çoklu Pencere Modunda Devre Dışı Bırakılan Özellikler

Çoklu pencere modundayken bazı sistem özellikleri etkinliklerinizden etkilenmeyecektir:
  • Sistem çubuklarının karartılması/gizlenmesi veya kapsamlı modun kullanılması gibi durum çubuğu ve gezinme çubuğu değişikliklerinin hiçbir etkisi olmayacaktır. Etkinliğiniz ekranın yalnızca bir kısmını kapladığından bu mantıklıdır.
  • android: screenOrientation Activity niteliğinin çoklu pencere modunda da hiçbir etkisi yoktur: Activity'niz yeniden boyutlandırılabileceği için sabit bir yönelime sahip olması artık mantıklı değildir.
Çoklu pencere olayları için yeni geri aramaların yanı sıra mevcut durumu sorgulama yöntemleri de eklendi.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): Etkinlik durumu tam ekrandan çoklu pencereye (veya tam tersi) değiştiğinde çağrılır.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): Etkinlik durumu PIP moduna/modundan değiştiğinde çağrılır.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): etkinliğin çoklu pencere/resim içinde resim modunda olup olmadığını döndürür.
  • Activity#overlayWithDecorCaption(boolean overlay): Serbest biçimli pencereler için bu yöntem, başlığın (pencereyi sürüklemek için kullanılan çubuk) içeriği aşağı itmek yerine üzerine bindirilmesini sağlamak için kullanılabilir.
PS. Dışında. Activity#overlayWithDecorCaption(), bu yöntemler aynı zamanda tarafından da sağlanmaktadır. Fragment sınıf.

Etkinlikleri Çoklu Pencere Modunda Başlatma

  • Activity#enterPictureInPictureMode() bir etkinliği resim içinde resim moduna geçirmek için kullanılabilir. PiP modundaki etkinliklerin giriş etkinlikleri hakkında bilgilendirilmediğini unutmayın; MediaSession#setMediaButtonReceiver() eğer bu tür olaylarla ilgilenmek istiyorsanız. Ayrıca ilgileniyorsanız Android Geliştiricileri web sitesini kontrol ettiğinizden emin olun. Android N'de resim içinde resim.
  • Cihaz bölünmüş ekran modundaysa, sisteme, sizin etkinliğinizin yanında başka bir etkinlik başlatmasını söyleyebilirsiniz. Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT bayrak. Bölünmüş ekran modunda değilse bayrağın hiçbir etkisi yoktur.
  • Cihaz serbest biçim modundaysa, ActivityOptions#setLaunchBounds() Yeni aktivitenin boyutlarını ve konumunu ekran üzerinde belirtmek için kullanılabilir.
Kod örnekleri için Çoklu Pencere Oyun Alanı örnek uygulamasına göz atın: bitişik aktivite örneği, fırlatma sınırları örneği.

Sürükle ve bırak

Sürükle ve bırak desteği Honeycomb'dan bu yana mevcut olsa da, daha önce yalnızca aynı aktivite içerisinde mümkündü. Kar. çoklu pencerede desteklenir ilave olarak. Bunu uygulamak öyle görünüyor. çoğunlukla eskisi gibi, çapraz etkinlik sürükle ve bırak işlemine yönelik birkaç eklemeyle birlikte:
  • View#startDragAndDrop()
    • için yeni takma ad View#startDrag().
    • Çapraz etkinlik sürükleyip bırakmayı etkinleştirmek için yeni bayrağı iletin View#DRAG_FLAG_GLOBAL.
    • Alıcı etkinliğine URI izinleri vermeniz gerekiyorsa yeni işaretleri iletin View#DRAG_FLAG_GLOBAL_URI_READ veya View#DRAG_FLAG_GLOBAL_URI_WRITE, uygun.
  • View#updateDragShadow()
    • Devam eden bir sürükleme işleminin sürükleme gölgesini değiştirir. Yalnızca sürükleme işlemini başlatan uygulama tarafından çağrılabilir.
  • View#cancelDragAndDrop()
    • Halihazırda devam eden bir sürükleme işlemini iptal eder. Yalnızca sürükleme işlemini başlatan uygulama tarafından çağrılabilir.
  • Bir cihazın serbest biçimli veya resim içinde resim modlarını destekleyip desteklemediğini kontrol etmek şu şekilde mümkündür: PackageManager#hasSystemFeature(), kullanarak PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT Ve PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE sırasıyla.
  • android: windowBackground Etkinlik yeniden boyutlandırılıyorsa ve oluşturulması geride kalıyorsa, öznitelik çizilebilir arka plan olarak kullanılabilir. Eğer android: windowBackground ayarlanmamış, android: windowBackgroundFallback onun yerine kullanılır. Örnek için Çoklu Pencere Oyun Alanı örnek uygulamasına bakın.
Wale, kullanıcılarınızın mümkün olan en iyi deneyimi yaşamasını sağlamak için bazı en iyi uygulamaları sundu:
  • İşleme modu zarif bir şekilde değişir:
    • Yönden bağımsız olarak kullanıcı arayüzü tutarlılığını koruyun. Sorunsuz geçişlere izin vermek için öğelerin konumlarını değiştirmeyin.
    • Yukarıdakileri genişleterek, telefon/tablet düzenleri için çok farklı düzenler arasında geçiş yapmayın. Bunun yerine tutarlılık sağlamak için tablet düzenini daha küçük boyutlara uyarlayın.
  • Faaliyetlerinizin küçük boyutlara uyum sağladığından emin olun ile Materyal Tasarımı modellerini takip ederek.
  • Kullanmak FLAG_ACTIVITY_LAUNCH_ADJACENT bölünmüş ekran modunda daha keyifli bir deneyim sağlamak mantıklı olduğunda.
  • Yalnızca gerekçelendirildiğinde yeniden boyutlandırma uyumsuzluğunu bildirin. Yukarıda tartıştığımız gibi, aksi takdirde uygulamanız kötü bir şekilde öne çıkar.
Wale bazı ek yararlı kaynaklar sunarak oturumu sonlandırdı:
  • Çoklu Pencere Dokümantasyonu.
  • Bölünmüş ekran modu için Materyal Tasarımı yönergeleri.
  • Örnek çoklu pencere uygulaması.