Çoklu pencere desteği

Çoklu pencere modu, birden fazla uygulamanın aynı ekranı aynı anda paylaşmasını sağlar. Uygulamalar yan yana veya birbirlerinin üzerine gelebilir (bölünmüş ekran modu), küçük bir pencerede diğer uygulamalarla yer paylaşımlı bir uygulama (pencere içinde pencere modu) veya ayrı, taşınabilir, yeniden boyutlandırılabilir pencerelerdeki ayrı uygulamalar (serbest biçim modu) olabilir.

Şekil 1. Bölünmüş ekran modunda iki uygulamayı yan yana görüntüleyin.

Kullanıcı deneyimi, Android sürümüne ve cihazın türüne bağlıdır:

  • Android 7.0 (API düzeyi 24), küçük ekranlı cihazlarda bölünmüş ekran modunu ve belirli cihazlarda pencere içinde pencere modunu kullanıma sundu.

    • Bölünmüş ekran modu, ekranı iki uygulamayla doldurarak uygulamaları yan yana veya birbirlerinin üzerinde gösterir. Kullanıcılar, iki uygulamayı birbirinden ayırmak için ayırıcıyı sürükleyerek uygulamalardan birini büyütebilir, diğerini küçültebilir.

    • Pencere içinde pencere modu, kullanıcıların başka bir uygulamayla etkileşim kurarken video oynatmaya devam etmesini sağlar (Pencere içinde pencere desteği bölümüne bakın).

    • Kullanıcıların her bir etkinliği serbestçe yeniden boyutlandırabildiği serbest biçim modu, büyük ekranlı cihaz üreticileri tarafından etkinleştirilebilir.

    Etkinliğinizin izin verilen minimum boyutlarını belirterek uygulamanızın çoklu pencere modunu nasıl işleyeceğini yapılandırabilirsiniz. Ayrıca, sistemin uygulamanızı her zaman tam ekran göstermesini sağlamak için resizeabableActivity="false" ayarını yaparak uygulamanız için çoklu pencere modunu devre dışı bırakabilirsiniz.

  • Android 8.0 (API düzeyi 26), pencere içinde pencere modunu küçük ekranlı cihazları da kapsayacak şekilde genişletir.

  • Android 12 (API düzeyi 31), çoklu pencere modunu standart davranışı haline getirir.

    • Platform, büyük ekranlarda (en küçük genişlik >= 600 dp) uygulama yapılandırmasından bağımsız olarak çoklu pencere modundaki tüm uygulamaları destekler. resizeableActivity="false" ise uygulama, ekran boyutlarının kullanılması için gerektiğinde uyumluluk moduna alınır.

    • Küçük ekranlarda (en küçük genişlik < 600 dp), sistem, etkinliğin çoklu pencere modunda çalışıp çalışamayacağını belirlemek için bir etkinliğin minWidth ve minHeight özelliklerini kontrol eder. resizeableActivity="false" değerine ayarlanırsa uygulamanın, minimum genişlik ve yükseklikten bağımsız olarak çoklu pencere modunda çalışması engellenir.

Bölünmüş ekran modu

Kullanıcılar, aşağıdakileri yaparak bölünmüş ekran modunu etkinleştirebilir:

  1. Son Kullanılanlar ekranını açın.
  2. Bir uygulamayı kaydırarak görünüm içine alın
  3. Uygulama başlık çubuğundaki uygulama simgesine basın
  4. Bölünmüş ekran menü seçeneğini belirleyin
  5. Son Kullanılanlar ekranından başka bir uygulama seçin veya Son Kullanılanlar ekranını kapatıp başka bir uygulama çalıştırın

Kullanıcılar, pencere ayırıcısını ekranın kenarına (yukarı veya aşağı, sola veya sağa) sürükleyerek bölünmüş ekran modundan çıkabilir.

Bitişikteki başlat

Uygulamanızın içeriğe bir amaç üzerinden erişmesi gerekiyorsa içeriği bitişik bir bölünmüş ekran penceresinde açmak için FLAG_ACTIVITY_LAUNCH_ADJACENT öğesini kullanabilirsiniz.

FLAG_ACTIVITY_LAUNCH_ADJACENT, bölünmüş ekran modunda çalışan uygulamaların bitişikteki pencerede etkinlik başlatmasına olanak tanımak için Android 7.0'da (API düzeyi 24) kullanıma sunulmuştur.

Android 12L (API düzeyi 32) ve sonraki sürümlerde, bayrağın tanımının genişletilmesi, tam ekran çalışan uygulamaların bölünmüş ekran modunu etkinleştirmesine ve ardından bitişikteki pencerede etkinlikleri başlatmasına olanak tanır.

Bitişik bir etkinliği başlatmak için FLAG_ACTIVITY_NEW_TASK ile birlikte FLAG_ACTIVITY_LAUNCH_ADJACENT kullanın. Örneğin:

Kotlin

fun openUrlInAdjacentWindow(url: String) {
    Intent(Intent.ACTION_VIEW).apply {
        data = Uri.parse(url)
        addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or
                           Intent.FLAG_ACTIVITY_NEW_TASK)
    }.also { intent ->
        startActivity(intent)
    }
}

Java

public void openUrlInAdjacentWindow(String url) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse(url));
    intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

Çoklu pencere modunda etkinlik yaşam döngüsü

Çoklu pencere modu, etkinlik yaşam döngüsünü değiştirmez. Bununla birlikte, birden fazla pencerede uygulamaların devam ettirilen durumu Android'in farklı sürümlerinde değişiklik gösterir.

Çoklu devam ettirme

Android 10 (API düzeyi 29) ve sonraki sürümler çoklu devam ettirmeyi destekler. Cihaz çoklu pencere modundayken tüm etkinlikler RESUMED durumunda kalır. Üstünde şeffaf bir etkinlik varsa veya etkinliğe odaklanılamıyorsa (örneğin, pencere içinde pencere modunda) bir etkinlik duraklatılabilir. Ayrıca, örneğin bildirim çekmecesi açıksa, belirli bir zamanda hiçbir etkinliğe odaklanılmamış da olabilirsiniz. onStop() yöntemi her zamanki gibi çalışır: Bir etkinlik ekrandan kaldırıldığında yöntem çağrılır.

Çoklu devam ettirme özelliği, Android 9 (API düzeyi 28) sürümünü çalıştıran belirli cihazlarda da kullanılabilir. Android 9 cihazlarda çoklu devam ettirmeyi etkinleştirmek için aşağıdaki manifest meta verilerini ekleyin:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

Belirli bir cihazın bu manifest meta verilerini desteklediğini doğrulamak için cihaz spesifikasyonlarına bakın.

Android 9

Android 9 (API düzeyi 28) ve önceki sürümlerde çoklu pencere modunda, belirli bir zamanda yalnızca kullanıcının en son etkileşimde bulunduğu etkinlik etkindir. Bu etkinlik, en üst olarak kabul edilir ve RESUMED durumundaki tek etkinliktir. Diğer tüm görünür etkinlikler STARTED olup RESUMED değildir. Bununla birlikte sistem, bu görünür ancak devam ettirilmeyen etkinliklere görünür olmayan etkinliklerden daha yüksek öncelik verir. Kullanıcı görünür etkinliklerden biriyle etkileşimde bulunursa bu etkinlik devam ettirilir ve önceki en önemli etkinlik STARTED durumuna girer.

Tek bir etkin uygulama işleminde birden fazla etkinlik olduğunda, en yüksek z sırasına sahip etkinlik devam ettirilir ve diğerleri duraklatılır.

Yapılandırma değişiklikleri

Kullanıcı bir uygulamayı çoklu pencere moduna koyduğunda, sistem bir yapılandırma değişikliği etkinliğini Yapılandırma değişikliklerini işleme bölümünde belirtildiği gibi bildirir. Bu durum, kullanıcı uygulamayı yeniden boyutlandırdığında veya uygulamayı tekrar tam ekran moduna getirdiğinde de gerçekleşir.

Esasen, bu değişikliğin etkinlik yaşam döngüsü üzerindeki etkileri, sisteme cihazın dikey yönden yatay yöne geçtiğinin sistem tarafından bildirilmesiyle aynıdır. Tek fark, uygulama boyutlarının değiştirilmesi yerine değiştirilmesidir. Etkinliğiniz, yapılandırma değişikliğini kendi başına yapabilir veya uygulamanız, sistemin etkinliği kaldırmasına ve yeni boyutlarla yeniden oluşturmasına izin verebilir.

Kullanıcı bir pencereyi yeniden boyutlandırır ve iki boyutta da büyütürse sistem, etkinliği kullanıcı işlemiyle eşleşecek şekilde yeniden boyutlandırır ve gerektiğinde yapılandırma değişiklikleri yapar. Uygulama yeni açığa çıkan alanlarda çizim konusunda geride kalıyorsa sistem bu alanları geçici olarak windowBackground veya varsayılan windowBackgroundFallback stil özelliğiyle belirtilen renkle doldurur.

Özel kaynak erişimi

Çoklu devam ettirme özelliğini desteklemeye yardımcı olmak için onTopResumedActivityChanged() yaşam döngüsü geri çağırmasını kullanın.

Geri çağırma, bir etkinlik en üst devam ettirilen etkinlik konumunu kazandığında veya kaybettiğinde çağrılır. Bu, etkinliğin mikrofon veya kamera gibi paylaşılan bir tekil kaynağı kullandığı durumlarda önemlidir.

Kotlin

override fun onTopResumedActivityChanged(topResumed: Boolean) {
    if (topResumed) {
        // Top resumed activity
        // Can be a signal to re-acquire exclusive resources
    } else {
        // No longer the top resumed activity
    }
}

Java

@Override
public void onTopResumedActivityChanged(boolean topResumed) {
    if (topResumed) {
        // Top resumed activity
        // Can be a signal to re-acquire exclusive resources
    } else {
        // No longer the top resumed activity
    }
}

Bir uygulamanın, paylaşılan bir donanımın kaldırılması gibi başka nedenlerle kaynakları kaybedebileceğini unutmayın.

Her durumda, bir uygulama mevcut kaynakları etkileyen etkinlikleri ve durum değişikliklerini incelikle yönetmelidir.

Kamera kullanan uygulamalarda CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged(), kameraya erişmeyi denemenin iyi bir zaman olabileceğine dair ipucu verir. Bu yöntem, Android 10 (API düzeyi 29) sürümünden itibaren kullanılabilir.

Kamerayı kullanan diğer uygulamalar başka ekranlarda açılabileceğinden resizeableActivity=false uygulamasının özel kamera erişimini garanti etmediğini unutmayın.

Şekil 2. Kamera çoklu pencere modunda.

Odağı kaybedildiğinde uygulamanızın kamerayı serbest bırakması gerekmez. Örneğin, kullanıcı yeni odaklanılan en önemli devam ettirilen uygulama ile etkileşimde bulunurken kamera önizlemesine devam etmek isteyebilirsiniz. Uygulamanızın devam ettirilen en önemli uygulama olmasa da kamerayı çalıştırmaya devam etmesi sorun yaratmaz, ancak bağlantı kesme kılıfını doğru bir şekilde yönetmesi gerekir. Devam ettirilen en üstteki uygulama kamerayı kullanmak istediğinde kamerayı açabilir ve uygulamanız erişimi kaybeder. Uygulama yeniden odakladığında kamerayı yeniden açabilir.

Bir uygulama CameraDevice.StateCallback#onDisconnected() geri çağırması aldıktan sonra kamera cihazından yapılan sonraki çağrılar CameraAccessException sinyalini verir.

Çoklu Ekran

Android 10 (API düzeyi 29), ikincil ekranlarda etkinlikleri destekler. Bir etkinlik birden çok ekranlı bir cihazda çalışıyorsa kullanıcılar etkinliği bir ekrandan diğerine taşıyabilir. Çoklu devam ettirme, çok ekranlı senaryolar için de geçerlidir. Birkaç etkinlik aynı anda kullanıcı girişini alabilir.

Bir uygulama, başlatıldığında veya başka bir etkinlik oluşturulduğunda hangi ekranda çalıştırılması gerektiğini belirtebilir. Bu davranış, manifest dosyasında tanımlanan etkinlik başlatma moduna ve etkinliği başlatan varlık tarafından belirlenen intent işaretleri ile seçeneklere bağlıdır. Daha fazla ayrıntı için ActivityOptions sınıfını inceleyin.

Bir etkinlik ikincil ekrana taşındığında bağlam güncellemesi, pencere yeniden boyutlandırma, yapılandırma ve kaynak değişiklikleri gibi işlemlerden geçebilir. Yapılandırma değişikliğini işleme alırsa etkinlik onConfigurationChanged() içinde bildirilir. Aksi takdirde etkinlik yeniden başlatılır.

Bir etkinlik, yapılandırma değişikliği işleniyorsa onCreate() ve onConfigurationChanged() alanlarındaki mevcut ekranı kontrol etmelidir. Ekran değiştiğinde kaynakları ve düzenleri güncellediğinizden emin olun.

Bir etkinlik için seçilen başlatma modu birden fazla örneğe izin veriyorsa ikincil ekranda başlatmak, etkinliğin yeni bir örneğini oluşturabilir. Her iki etkinlik de aynı anda devam ettirilir.

Şekil 3.Bir etkinliğin birden fazla ekranda birden fazla örneği.

Ayrıca, Android 8.0'da kullanıma sunulan çoklu ekran API'leri hakkında bilgi edinmek de isteyebilirsiniz.

Etkinlik ve uygulama bağlamı

Çoklu görüntülü reklamlarda doğru bağlamı kullanmak çok önemlidir. Kaynaklara erişirken etkinlik bağlamı (gösterilen) uygulama bağlamından (gösterilmez) farklıdır.

Etkinlik bağlamı ekranla ilgili bilgiler içerir ve her zaman etkinliğin göründüğü görüntüleme alanı için ayarlanır. Bu, uygulamanızın görüntü yoğunluğu veya pencere metrikleri hakkında doğru bilgileri almanızı sağlar. Mevcut pencere veya ekran hakkında bilgi almak için her zaman etkinlik bağlamını (veya kullanıcı arayüzü tabanlı başka bir bağlamı) kullanmanız gerekir. Bu durum, bağlamdan alınan bilgileri kullanan bazı sistem API'lerini de etkiler (örneğin, Kısa mesajlara genel bakış konusuna bakın).

Etkinlik penceresi yapılandırması ve üst ekran, kaynakları ve bağlamı tanımlar. Mevcut ekranı aşağıdaki gibi alın:

Kotlin

val activityDisplay = activity.getDisplay()

Java

Display activityDisplay = activity.getDisplay();

Mevcut etkinlik aralığı metriklerini alın:

Kotlin

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Java

WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();

Geçerli sistem yapılandırması için maksimum pencere metriklerini alın:

Kotlin

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

Java

WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();

Maksimum aralık metrikleri; hesaplamalar yapmak, düzen seçimleri yapmak veya önceden getirilecek kaynakların boyutunu belirlemek içindir. Bu özelliğin onCreate() içinde sunulması, ilk düzen geçişinden önce bu kararları almanıza olanak tanır. Bu metrikler, belirli görünüm öğelerini düzenlemek için kullanılmamalıdır. Bunun yerine Configuration nesnesindeki bilgileri kullanın.

Ekran kesimleri

Katlanabilir cihazların katlanıp açıldığında farklı kesim geometrisi olabilir. Kesme sorunlarını önlemek için Ekran kesimlerini destekleme bölümüne bakın.

İkincil ekranlar

Kullanılabilir ekranları DisplayManager sistem hizmetinden edinebilirsiniz:

Kotlin

val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = displayManager.getDisplays()

Java

DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = displayManager.getDisplays();

Ekran boyutu veya bir ekranın güvenli olup olmadığını gösteren işaretler gibi belirli bir ekran hakkında bilgi almak için Display sınıfını kullanın. Ancak, görüntü boyutunun uygulamanız için ayrılan görüntüleme alanıyla aynı olacağını varsaymayın. Uygulamanızın, çoklu pencere modunda ekranın bir kısmını kapladığını unutmayın.

Bir etkinliğin ekranda başlatılıp başlatılamayacağını belirleyin:

Kotlin

val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)

Java

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);

Sonra ekranda etkinliği başlatın:

Kotlin

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId)
startActivity(intent, options.toBundle())

Java

ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchDisplayId(targetDisplay.displayId);
startActivity(intent, options.toBundle());

Çoklu ekran desteği

Android yazılım klavyeleri, duvar kağıtları ve başlatıcılar için çoklu ekran desteği sağlar.

Yazılım klavyesi

Ekran, sistem süslemelerini destekleyecek şekilde yapılandırılmışsa ikincil ekranda klavye gösterilebilir. Bir metin alanı söz konusu ekranda giriş isterse giriş yöntemi düzenleyicisi otomatik olarak görünür.

Şekil 4. İkincil ekrandaki klavye.

Duvar kağıdı

Android 10'da (API düzeyi 29) ikincil ekranlarda duvar kağıdı olabilir. Çerçeve, her ekran için ayrı bir WallpaperService.Engine örneği oluşturur. Her motorun yüzeyinin ayrı ayrı çizildiğinden emin olun. Geliştiriciler, WallpaperService.Engine#getDisplayContext()'deki görüntülü reklam bağlamını kullanarak öğeleri yükleyebilir. Ayrıca, WallpaperInfo.xml dosyanızda android:supportsMultipleDisplays="true" bulunduğundan emin olun.

Şekil 5. Telefonda ve ikincil ekranda duvar kağıdı.

Launcher'lar

Yeni amaç filtresi kategorisi (SECONDARY_HOME), ikincil ekranlar için özel bir etkinlik sağlar. Etkinliğin örnekleri, her ekran başına bir tane olmak üzere sistem süslemelerini destekleyen tüm ekranlarda kullanılır.

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

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

Örneğin, Launcher3'in AOSP uygulaması bir SECONDARY_HOME etkinliğini destekler.

Şekil 6. Telefonda Materyal Tasarım başlatıcı.
Şekil 7. İkincil ekranda Materyal Tasarım başlatıcı.

Aralık metrikleri

Android 11 (API düzeyi 30), çoklu pencere modunda çalışan uygulamaların sınırlarını sağlamak için aşağıdaki WindowManager yöntemlerini kullanıma sundu:

Jetpack WindowManager kitaplık yöntemleri computeCurrentWindowMetrics() ve computeMaximumWindowMetrics() sırasıyla ancak API düzeyi 14 ile geriye dönük uyumluluğa sahip olan benzer işlevler sunar.

Mevcut ekran dışındaki ekranlara ilişkin metrikleri almak için aşağıdakileri (kod snippet'inde gösterildiği gibi) yapın:

  • Görüntülü reklam bağlamı oluşturma
  • Ekran için pencere bağlamı oluştur
  • Pencere bağlamının WindowManager bilgisini al
  • Uygulamanın kullanabileceği maksimum görüntüleme alanının WindowMetrics kadarını alın

Kotlin

val windowMetrics = context.createDisplayContext(display)
                    .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
                    .getSystemService(WindowManager::class.java)
                    .maximumWindowMetrics

Java

WindowMetrics windowMetrics = context.createDisplayContext(display)
                              .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
                              .getSystemService(WindowManager.class)
                              .getMaximumWindowMetrics();

Desteği sonlandırılan yöntemler

Display yöntemleri getSize() ve getMetrics(), API düzeyi 30'da kullanımdan kaldırılarak yeni WindowManager yöntemlerinin yerini aldı.

Android 12 (API düzeyi 31), Display getRealSize() ve getRealMetrics() yöntemlerini kullanımdan kaldırır ve davranışlarını getMaximumWindowMetrics() davranışıyla daha yakından eşleşecek şekilde günceller.

Çoklu pencere modu yapılandırması

Uygulamanız Android 7.0 (API düzeyi 24) veya sonraki sürümleri hedefliyorsa uygulamanızın etkinliklerinin çoklu pencere modunu destekleyip desteklemediğini ve destekleyip desteklemeyeceğini yapılandırabilirsiniz. Hem boyutu hem de düzeni kontrol etmek için manifest dosyanızda özellikler ayarlayabilirsiniz. Bir kök etkinliğinin özellik ayarları, görev yığınındaki tüm etkinlikler için geçerlidir. Örneğin, kök etkinlikte android:resizeableActivity="true" varsa görev yığınındaki tüm etkinlikler yeniden boyutlandırılabilir. Chromebook'lar gibi bazı daha büyük cihazlarda, android:resizeableActivity="false" değerini belirtseniz bile uygulamanız yeniden boyutlandırılabilir bir pencerede çalışabilir. Bu durum uygulamanızı bozarsa uygulamanızın bu tür cihazlarda kullanılabilirliğini kısıtlamak için Google Play'deki filtreleri kullanabilirsiniz.

Android 12 (API düzeyi 31) varsayılan olarak çoklu pencere moduna ayarlanır. Büyük ekranlarda (sw >= 600 dp), tüm uygulamalar, uygulama yapılandırmasından bağımsız olarak çoklu pencere modunda çalışır. Sistem, küçük ekranlarda etkinliğin minWidth, minHeight ve resizeableActivity ayarlarını kontrol ederek etkinliğin çoklu pencere modunda çalışıp çalışmadığını belirler.

resizeableActivity

API düzeyi 30 ve önceki sürümlerde çoklu pencere modunu etkinleştirmek veya devre dışı bırakmak için manifest dosyanızın <activity> veya <application> öğesinde bu özelliği ayarlayın:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

Bu özellik true değerine ayarlanırsa etkinlik, bölünmüş ekran ve serbest biçimli modlarda başlatılabilir. Özellik false değerine ayarlanırsa etkinlik, çoklu pencere modunu desteklemez. Değer false ise ve kullanıcı etkinliği çoklu pencere modunda başlatmaya çalışırsa etkinlik tam ekranı devralır.

Uygulamanız API düzeyi 24 veya üstünü hedefliyorsa ancak bu özellik için bir değer belirtmezseniz özelliğin değeri varsayılan olarak "doğru" olur.

Uygulamanız API düzeyi 31 veya üstünü hedefliyorsa bu özellik küçük ve büyük ekranlarda farklı şekilde çalışır:

  • Büyük ekranlar (sw >= 600 dp): Tüm uygulamalar çoklu pencere modunu destekler. Bu özellik, bir etkinliğin yeniden boyutlandırılıp boyutlandırılamayacağını belirtir. resizeableActivity="false" ise uygulama, ekran boyutlarına uyması gerektiğinde uyumluluk moduna alınır.
  • Küçük ekranlar (sw < 600 dp): resizeableActivity="true" ve etkinlik minimum genişlik ve minimum yükseklik çoklu pencere gereksinimleri kapsamındaysa etkinlik, çoklu pencere modunu destekler. resizeableActivity="false" ise etkinlik, minimum genişlik ve yükseklikten bağımsız olarak çoklu pencere modunu desteklemez.

supportsPictureInPicture

Etkinliğin pencere içinde pencere modunu destekleyip desteklemediğini belirtmek için manifest dosyanızın <activity> düğümünde bu özelliği ayarlayın.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />

configChanges

Kullanıcının bir pencereyi yeniden boyutlandırması gibi çok pencereli yapılandırma değişikliklerini kendiniz yönetmek için uygulama manifesti <activity> düğümüne en azından aşağıdaki değerlere sahip android:configChanges özelliğini ekleyin:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

android:configChanges eklendikten sonra etkinliğiniz ve parçalarınız yok edilip yeniden oluşturulmak yerine onConfigurationChanged() için bir geri çağırma alır. Daha sonra görünümlerinizi manuel olarak güncelleyebilir, kaynakları yeniden yükleyebilir ve gerektiğinde diğer işlemleri gerçekleştirebilirsiniz.

<layout>

Android 7.0 (API düzeyi 24) ve sonraki sürümlerde <layout> manifest öğesi, bir etkinliğin çoklu pencere modunda nasıl davranacağını etkileyen çeşitli özellikleri destekler:

  • android:defaultHeight, android:defaultWidth: Serbest biçim modunda başlatıldığında etkinliğin varsayılan yüksekliği ve genişliği.

  • android:gravity: Serbest biçim modunda başlatıldığında etkinliğin ilk yerleşimi. Uygun değerler için Gravity sınıfına bakın.

  • android:minHeight, android:minWidth: Hem bölünmüş ekran hem de serbest biçimli modlarda etkinlik için minimum yükseklik ve minimum genişlik. Kullanıcı, bölünmüş ekran modunda ayırıcıyı bir etkinliği belirtilen minimum değerden daha küçük yapmak için taşırsa sistem, etkinliği kullanıcının istediği boyuta göre kırpar.

Aşağıdaki kodda, serbest biçim modunda görüntülenen bir etkinliğin varsayılan boyutu ile konumunun ve minimum boyutunun nasıl belirtileceği gösterilmektedir:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>

Çalışma zamanında çoklu pencere modu

Sistem, Android 7.0'dan itibaren çoklu pencere modunda çalışabilen uygulamaları destekleyecek işlevler sunar.

Çoklu pencere modunda devre dışı özellikler

Android, çoklu pencere modunda, cihaz ekranını başka etkinliklerle veya uygulamalarla paylaşan etkinlikler için geçerli olmayan özellikleri devre dışı bırakabilir veya yoksayabilir.

Ayrıca, bazı sistem kullanıcı arayüzü özelleştirme seçenekleri devre dışıdır. Örneğin, uygulamalar çoklu pencere modunda çalışıyorlarsa durum çubuğunu gizleyemez (bkz. Sistem kullanıcı arayüzü görünürlüğünü kontrol etme).

Sistem, android:screenOrientation özelliğinde yapılan değişiklikleri yoksayar.

Çoklu pencere modu sorguları ve geri çağırmalar

Activity sınıfı, çoklu pencere modunu desteklemek için aşağıdaki yöntemleri sunar:

  • isInMultiWindowMode(): Etkinliğin çoklu pencere modunda olup olmadığını belirtir.

  • isInPictureInPictureMode(): Etkinliğin pencere içinde pencere modunda olup olmadığını gösterir.

  • onMultiWindowModeChanged(): Etkinlik, çoklu pencere moduna geçtiğinde veya bu moddan çıktığında sistem, bu yöntemi çağırır. Etkinlik, çoklu pencere moduna giriyorsa sistem, yöntemi "true" (doğru) değerini, etkinlik çoklu pencere modundan çıkıyorsa "false" (yanlış) değerini iletir.

  • onPictureInPictureModeChanged(): Etkinlik, pencere içinde pencere moduna geçtiğinde veya bu moddan çıktığında sistem bu yöntemi çağırır. Etkinlik pencere içinde pencere moduna giriyorsa sistem bu yöntemi true (doğru), pencere içinde pencere modundan çıkıyorsa false (yanlış) değerini iletir.

Fragment sınıfı, bu yöntemlerin birçoğunun sürümlerini sunar (örneğin, Fragment.onMultiWindowModeChanged()).

Pencere içinde pencere modu

Bir etkinliği pencere içinde pencere moduna almak için enterPictureInPictureMode() işlevini çağırın. Cihaz pencere içinde pencere modunu desteklemiyorsa bu yöntemin herhangi bir etkisi olmaz. Daha fazla bilgi için Pencere içinde pencere (PiP) özelliğini kullanarak video ekleme bölümünü inceleyin.

Çoklu pencere modunda yeni etkinlikler

Yeni bir etkinlik başlattığınızda, mümkünse yeni etkinliğin geçerli etkinliğin yanında görüntülenmesi gerektiğini belirtebilirsiniz. Amaç işaretini FLAG_ACTIVITY_LAUNCH_ADJACENT kullanın. Bu işaret, iki etkinliğin ekranı paylaşmasını sağlamak için sisteme yeni etkinliği bitişik bir pencerede oluşturmayı denemesini söyler. Sistem bunun için elinden gelenin en iyisini yapar ancak bunun olacağı garanti edilmez.

Bir cihaz serbest biçim modundaysa ve yeni bir etkinlik başlatıyorsanız ActivityOptions.setLaunchBounds() numaralı telefonu arayarak yeni etkinliğin boyutlarını ve ekran konumunu belirtebilirsiniz. Cihaz çoklu pencere modunda değilse bu yöntemin hiçbir etkisi olmaz.

API düzeyi 30 ve daha düşük sürümlerde, görev yığını içinde bir etkinlik başlatırsanız etkinlik, ekrandaki etkinliğin yerini alır ve tüm çoklu pencere özelliklerini devralır. Yeni etkinliği çok pencereli modda ayrı bir pencere olarak başlatmak istiyorsanız bunu yeni bir görev yığınında başlatmanız gerekir.

Android 12 (API düzeyi 31), uygulamaların bir uygulamanın görev penceresini birden fazla etkinliğe bölmesini sağlar. Bir XML yapılandırma dosyası oluşturarak veya Jetpack WindowManager API çağrıları yaparak uygulamanızın etkinliklerini nasıl (tam ekran, yan yana veya yığın) göstereceğini siz belirlersiniz.

Sürükleyin ve bırakın

Kullanıcılar, iki etkinlik ekranı paylaşırken bir etkinlikten diğerine veri sürükleyip bırakabilir. (Android 7.0'dan önce kullanıcılar verileri yalnızca tek bir etkinlik içinde sürükleyip bırakabiliyordu.) Çıkarılan içerikleri kabul etmeyle ilgili hızlıca destek almak için DropHelper API'ye göz atın. Kapsamlı sürükle ve bırak kılavuzu için Sürükleyip bırakma işlevini etkinleştirme bölümüne bakın.

Birden çok örnek

Her kök etkinliğinin, ayrı bir işlemde yürütülen ve kendi penceresinde gösterilen kendi görevi vardır. Uygulamanızın yeni bir örneğini ayrı bir pencerede başlatmak için FLAG_ACTIVITY_NEW_TASK işaretiyle yeni etkinlikler başlatabilirsiniz. Yeni pencere için belirli bir konum istemek üzere bunu çoklu pencere özelliklerinden bazılarıyla birleştirebilirsiniz. Örneğin, bir alışveriş uygulamasında ürünleri karşılaştırmak için birden fazla pencere gösterilebilir.

Android 12 (API düzeyi 31), aynı görev penceresinde bir etkinliğin iki örneğini yan yana başlatmanıza olanak tanır.

Kullanıcıların, uygulama başlatıcıdan veya görev çubuğundan uygulamanızın başka bir örneğini başlatmasına izin vermek isterseniz başlatıcı Etkinliğinizin android:resizeableActivity="true" olarak ayarlandığından ve birden fazla örneği engelleyen bir başlatma modu kullanmadığından emin olun. Örneğin, bir singleInstancePerTask etkinliği FLAG_ACTIVITY_MULTIPLE_TASK veya FLAG_ACTIVITY_NEW_DOCUMENT ayarlandığında farklı görevlerde birden çok kez örneklenebilir.

Çoklu örneği, tek bir pencere içinde çalıştırılan SlidingPaneLayout kullanan list-detail sunusu gibi çok panelli bir düzenle karıştırmayın.

Katlanabilir bir cihazda birden fazla örnek ayrı pencerelerde çalışırken durumun değişmesi durumunda bir veya daha fazla örneğin arka plana gönderilebileceğini unutmayın. Örneğin, bir cihazın açılmış olduğunu ve ekranın her iki yanındaki iki pencerede çalışan iki uygulama örneği olduğunu varsayalım. Cihaz katlanmışsa daha küçük bir ekrana her iki örnekteki pencereleri sığdırmaya çalışmak yerine örneklerden biri sonlandırılabilir.

Çok pencere modu doğrulaması

Uygulamanızın API düzeyi 24 veya üstünü hedefleyip hedeflemediğine bakılmaksızın, kullanıcının Android 7.0 veya sonraki bir sürümü çalıştıran bir cihazda uygulamayı çok pencereli modda başlatmaya çalışması durumunda uygulamanızın çoklu pencere modunda nasıl davrandığını doğrulamanız gerekir.

Test cihazları

Android 7.0 (API düzeyi 24) veya sonraki sürümleri çalıştıran cihazlar çoklu pencere modunu destekler.

API düzeyi 23 veya daha düşük

Kullanıcılar uygulamayı çoklu pencere modunda kullanmaya çalıştıklarında, uygulama sabit yön belirtmediği sürece sistem uygulamayı zorla yeniden boyutlandırır.

Uygulamanız sabit yön bildirmiyorsa uygulamanızı Android 7.0 veya sonraki sürümleri çalıştıran bir cihazda başlatmalı ve bölünmüş ekran moduna geçirmeyi denemelisiniz. Uygulama zorla yeniden boyutlandırıldığında kullanıcı deneyiminin kabul edilebilir olduğunu doğrulayın.

Uygulama sabit yön belirtiyorsa uygulamayı çoklu pencere moduna almayı denemeniz gerekir. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığından emin olun.

24 ile 30 arasındaki API düzeyleri

Uygulamanız 24 ile 30 arasındaki API düzeylerini hedefliyorsa ve çoklu pencere desteğini devre dışı bırakmıyorsa hem bölünmüş ekran hem de serbest biçimli modlarda aşağıdaki davranışı doğrulayın:

  • Uygulamayı tam ekran olarak başlatın, ardından Son Kullanılanlar düğmesine uzun basarak çoklu pencere moduna geçin. Uygulamanın düzgün bir şekilde geçiş yaptığından emin olun.

  • Uygulamayı doğrudan çoklu pencere modunda başlatın ve uygulamanın doğru şekilde başlatıldığını doğrulayın. Son kullanılanlar düğmesine bastıktan sonra uygulamanızın başlık çubuğuna uzun basıp ekranın vurgulanan alanlarından birine sürükleyerek bir uygulamayı çoklu pencere modunda başlatabilirsiniz.

  • Ekran ayırıcıyı sürükleyerek uygulamanızı bölünmüş ekran modunda yeniden boyutlandırın. Uygulamanın kilitlenmeden yeniden boyutlandırıldığını ve gerekli kullanıcı arayüzü öğelerinin görünür olduğunu doğrulayın.

  • Uygulamanız için minimum boyutlar belirlediyseniz, uygulamayı pencere boyutu bu boyutlardan daha küçük olacak şekilde yeniden boyutlandırmayı deneyin. Uygulamayı belirtilen minimum boyutlardan daha küçük olacak şekilde yeniden boyutlandıramayacağınızı doğrulayın.

  • Tüm testler aracılığıyla uygulamanızın performansının kabul edilebilir düzeyde olduğunu doğrulayın. Örneğin, uygulama yeniden boyutlandırıldıktan sonra kullanıcı arayüzünü güncellemek için çok uzun bir gecikme olmadığını doğrulayın.

API düzeyi 31 veya üstü

Uygulamanız API düzeyi 31 veya üstünü hedefliyorsa ve ana etkinliğin minimum genişliği ve minimum yüksekliği, kullanılabilir görüntüleme alanının ilgili boyutlarından küçük veya bu boyutlara eşitse 24 ile 30 arasındaki API düzeyleri için listelenen tüm davranışları doğrulayın.

Test kontrol listesi

Uygulamanızın çoklu pencere modunda performansını doğrulamak için aşağıdaki işlemleri deneyin. Aksi belirtilmedikçe, bu işlemleri hem bölünmüş ekran hem de serbest biçimli modda denemelisiniz.

  • Çoklu pencere moduna girin ve bu moddan çıkın.

  • Uygulamanızdan başka bir uygulamaya geçin ve uygulamanın görünür ama etkin değilken düzgün davrandığını doğrulayın. Örneğin, uygulamanız video oynatıyorsa kullanıcı başka bir uygulamayla etkileşimde bulunurken videonun oynatılmaya devam ettiğini doğrulayın.

  • Bölünmüş ekran modundayken, uygulamanızı hem daha büyük hem de daha küçük hale getirmek için ekran ayırıcının yerini değiştirmeyi deneyin. Bu işlemleri hem yan yana hem de diğer yapılandırmaların üstünde olacak şekilde deneyin. Uygulamanın kilitlenmediğini, temel işlevlerin görünür olduğunu ve yeniden boyutlandırma işleminin çok uzun sürmediğini doğrulayın.

  • Art arda birkaç yeniden boyutlandırma işlemi gerçekleştirin. Uygulamanızın kilitlenmediğini veya bellek sızdırmadığını doğrulayın. Android Studio'nun Bellek Profil Aracı, uygulamanızın bellek kullanımı hakkında bilgi sağlar (Bellek Profil Aracı ile uygulamanızın bellek kullanımını inceleme bölümüne bakın).

  • Uygulamanızı çeşitli pencere yapılandırmalarında normal bir şekilde kullanın ve uygulamanın düzgün bir şekilde davrandığını doğrulayın. Metnin okunabilir olduğunu ve kullanıcı arayüzü öğelerinin etkileşimde bulunamayacak kadar küçük olmadığını doğrulayın.

Çoklu pencere desteği devre dışı bırakıldı

24 ile 30 arasındaki API düzeylerinde, android:resizeableActivity="false" ayarlayarak çoklu pencere desteğini devre dışı bıraktıysanız uygulamanızı Android 7.0 ile 11 arasındaki sürümleri çalıştıran bir cihazda kullanıma sunmalı ve uygulamayı bölünmüş ekran ve serbest biçim moduna geçirmeyi denemelisiniz. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığından emin olun.

Ek kaynaklar

Android'de çoklu pencere desteği hakkında daha fazla bilgi edinmek için:

##

Sizin için önerilenler

* Not: bağlantı metni JavaScript kapalıyken gösterilir * Cihaz uyumluluğu modu * Büyük ekranları yeniden boyutlandırmayı destekleyin * Yapılandırma değişikliklerini işleme