Çoklu pencere modunu destekleme

Çoklu pencere modu, birden fazla uygulamanın aynı ekranı aynı anda paylaşmasını sağlar. Uygulamalar yan yana veya üst üste (bölünmüş ekran modu), diğer uygulamaların üzerinde küçük bir pencerede (pencere içinde pencere modu) ya da ayrı taşınabilir ve yeniden boyutlandırılabilir pencerelerde (masaüstü pencere modu) olabilir.

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

Telefonlarda bölünmüş ekran moduna erişmeyle ilgili kullanıcı talimatları için Pixel telefonda aynı anda iki uygulamayı görme başlıklı makaleye gidin.

Sürüme özel çoklu pencere özellikleri

Çoklu pencere kullanıcı deneyimi, Android sürümüne ve cihaz türüne bağlıdır:

  • Android 7.0 (API düzeyi 24) ile küçük ekranlı cihazlarda bölünmüş ekran modu, belirli cihazlarda ise resim içinde resim modu kullanıma sunuldu.

    • Bölünmüş ekran modu, ekranı iki uygulamayla doldurarak bunları yan yana veya üst üste gösterir. Kullanıcılar, iki uygulamayı ayıran ayırıcıyı sürükleyerek bir uygulamayı büyütüp diğerini küçültebilir.

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

    • Kullanıcıların her etkinliği serbestçe yeniden boyutlandırabildiği masaüstü pencere modu, büyük ekranlı cihazların üreticileri tarafından etkinleştirilebilir.

      Etkinliğinizin izin verilen minimum boyutlarını belirterek uygulamanızın çok pencereli modu nasıl işleyeceğini yapılandırabilirsiniz. Sistemin uygulamanızı her zaman tam ekran göstermesini sağlamak için resizeableActivity="false" ayarını yaparak uygulamanızda çoklu pencere modunu da devre dışı bırakabilirsiniz.

  • Android 8.0 (API düzeyi 26), resim içinde resim modunu küçük ekranlı cihazlara da getiriyor.

  • Android 12 (API düzeyi 31), çok pencereli modu standart davranış haline getiriyor.

    • Büyük ekranlarda (orta veya genişletilmiş pencere boyutu sınıfı), platform, uygulama yapılandırmasından bağımsız olarak çok pencereli moddaki tüm uygulamaları destekler. resizeableActivity="false" ise uygulama, ekran boyutlarına uyum sağlamak için gerektiğinde uyumluluk moduna alınır.

    • Küçük ekranlarda (compact pencere boyutu sınıfı), sistem bir etkinliğin çok pencereli modda çalışıp çalışamayacağını belirlemek için etkinliğin minWidth ve minHeight özelliklerini kontrol eder. Bu durumda resizeableActivity="false", uygulama minimum genişlik ve yükseklik değerlerinden bağımsız olarak çoklu pencere modunda çalışamaz.

  • Android 16 (API düzeyi 36), ekran yönü, en-boy oranı ve yeniden boyutlandırılabilirlik kısıtlamalarını geçersiz kılar.

    • Büyük ekranlarda (en küçük genişlik >= 600 dp) sistem, uygulamanın yönünü, en boy oranını ve yeniden boyutlandırılabilirliğini kısıtlamak için kullanılan manifest özelliklerini ve çalışma zamanı API'lerini yoksayar. Böylece, tüm cihaz form faktörlerinde kullanıcı deneyimi optimize edilir.

      Oyunları Android 16 değişikliklerinin dışında tutma hakkında bilgi edinmek için Uygulama yönü, en boy oranı ve yeniden boyutlandırılabilme istisnaları bölümüne bakın.

Bölünmüş ekran modu

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

  1. Son kullanılanlar ekranını açın.
  2. Bir uygulamayı görünür hale getirmek için kaydırma
  3. Uygulama başlık çubuğunda 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ıyı ekranın kenarına (yukarı veya aşağı, sola ya da sağa) sürükleyerek bölünmüş ekran modundan çıkabilir.

Bitişik başlatma

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

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

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

Yakın 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ü

Çok pencereli mod, etkinlik yaşam döngüsünü değiştirmez. Ancak, birden fazla penceredeki uygulamaların devam ettirilen durumu, Android'in farklı sürümlerinde farklılık gösterir.

Çoklu özgeçmiş

Android 10 (API düzeyi 29) ve sonraki sürümlerde çoklu devam ettirme desteklenir. Cihaz çok pencereli moddayken tüm etkinlikler RESUMED durumunda kalır. Etkinliğin üzerinde şeffaf bir etkinlik varsa veya etkinlik odaklanılabilir değilse (ör. etkinlik pencere içinde pencere modundaysa) etkinlik duraklatılabilir. Ayrıca, belirli bir zamanda hiçbir etkinliğin odaklanmaması da mümkündür. Örneğin, bildirim çekmecesi açıksa. 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) çalıştıran belirli cihazlarda da kullanılabilir. Android 9 cihazlarda çoklu devam ettirme özelliğini 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 özelliklerine bakın.

Android 9

Android 9 (API düzeyi 28) ve önceki sürümlerdeki çok pencereli modda, belirli bir zamanda yalnızca kullanıcının en son etkileşimde bulunduğu etkinlik aktiftir. Bu etkinlik en üstteki etkinlik olarak kabul edilir ve RESUMED durumundaki tek etkinliktir. Diğer tüm görünür etkinlikler STARTED ancak RESUMED değildir. Ancak 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şime girerse bu etkinlik devam ettirilir ve daha önce en üstte olan etkinlik STARTED durumuna girer.

Tek bir etkin uygulama sürecinde 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ı çok pencereli moda aldığında sistem, Yapılandırma değişikliklerini işleme bölümünde belirtildiği gibi yapılandırma değişikliği etkinliğini bildirir. Bu durum, kullanıcı uygulamayı yeniden boyutlandırdığında veya uygulamayı tekrar tam ekran moduna aldığında da gerçekleşir.

Bu değişiklik, sistemin uygulamaya cihazın dikeyden yatay yönlendirmeye geçtiğini bildirmesiyle aynı etkinlik yaşam döngüsü etkilerine sahiptir. Ancak bu durumda yalnızca değiştirilmek yerine uygulama boyutları değiştirilir. Etkinliğiniz yapılandırma değişikliğini kendisi işleyebilir veya uygulamanız, sistemin etkinliği yok etmesine ve yeni boyutlarla yeniden oluşturmasına izin verebilir.

Kullanıcı bir pencereyi yeniden boyutlandırıp her iki boyutta da büyütürse sistem, etkinliği kullanıcı işlemine uyacak şekilde yeniden boyutlandırır ve gerektiğinde yapılandırma değişiklikleri yapar. Uygulama, yeni gösterilen alanları çizme konusunda gecikirse sistem bu alanları geçici olarak windowBackground özelliği veya varsayılan windowBackgroundFallback stil özelliği tarafından belirtilen renkle doldurur.

Özel kaynaklara erişim

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

Geri çağırma, bir etkinlik en üstteki devam ettirilen etkinlik konumunu kazandığında veya kaybettiğinde çağrılır. Bu, bir etkinlik mikrofon veya kamera gibi paylaşılan tekil bir kaynak kullandığında ö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 parçasının kaldırılması gibi başka nedenlerle de kaynak kaybedebileceğini unutmayın.

Her durumda, bir uygulama, kullanılabilir kaynakları etkileyen etkinlikleri ve durum değişikliklerini sorunsuz bir şekilde yönetmelidir.

Kamera kullanan uygulamalar için, CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() kameraya erişmeyi denemek için uygun 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 simgesinin, kameraya özel erişim garantisi vermediğini unutmayın.

Şekil 2. Çoklu pencere modunda kamera.

Uygulamanızın, odak kaybedildiğinde kamerayı serbest bırakması gerekmez. Örneğin, kullanıcı yeni odaklanmış en üstteki devam ettirilen uygulamayla etkileşimde bulunurken kamera önizlemesine devam etmek isteyebilirsiniz. Uygulamanızın, en üstteki devam ettirilen uygulama olmadığı zamanlarda kamerayı çalıştırmaya devam etmesi sorun değildir ancak bağlantı kesilmesi durumunu düzgün şekilde ele alması gerekir. En üstteki devam ettirilen uygulama kamerayı kullanmak istediğinde kamerayı açabilir ve uygulamanız erişimi kaybeder. Uygulamanız, odak noktası tekrar uygulamaya döndüğünde kamerayı yeniden açabilir.

Bir uygulama CameraDevice.StateCallback#onDisconnected() geri çağırması aldıktan sonra kamera cihazındaki sonraki aramalar CameraAccessException oluşturur.

Pencere 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ığı yöntemleri computeCurrentWindowMetrics() ve computeMaximumWindowMetrics() sırasıyla benzer işlevler sunar ancak API düzeyi 14 ile geriye dönük uyumludur.

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

  • Görüntüleme bağlamı oluşturma
  • Ekranda gösterilecek içerik için pencere bağlamı oluşturma
  • Pencere bağlamının WindowManager
  • Uygulamanın kullanabileceği maksimum görüntüleme alanının WindowMetrics'ını elde edin

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();

Kullanımdan kaldırılan yöntemler

Display yöntemleri getSize() ve getMetrics(), yeni WindowManager yöntemleri lehine API seviyesi 30'da kullanımdan kaldırıldı.

Android 12 (API düzeyi 31), Display yöntemlerini getRealSize() ve getRealMetrics() 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 çok pencereli modu nasıl ve destekleyip desteklemediğini yapılandırabilirsiniz. Hem boyutu hem de düzeni kontrol etmek için manifest dosyanızda özellikler ayarlayabilirsiniz. Bir kök etkinliğin ö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 gibi bazı büyük cihazlarda, android:resizeableActivity="false" belirtmiş olsanız bile uygulamanız yeniden boyutlandırılabilir bir pencerede çalışabilir. Bu durum uygulamanızın çalışmasını engelliyorsa uygulamanızın bu tür cihazlarda kullanılabilirliğini kısıtlamak için Google Play'deki filtreleri kullanabilirsiniz.

Android 12'de (API düzeyi 31) varsayılan olarak çoklu pencere modu kullanılır. Büyük ekranlarda (orta veya genişletilmiş pencere boyutu sınıfı), uygulama yapılandırmasından bağımsız olarak tüm uygulamalar çok pencereli modda çalışır. Küçük ekranlarda sistem, etkinliğin çok pencereli modda çalışıp çalışamayacağını belirlemek için etkinliğin minWidth, minHeight ve resizeableActivity ayarlarını kontrol eder.

resizeableActivity

API düzeyi 30 ve daha düşük sürümlerde çok pencereli modu etkinleştirmek veya devre dışı bırakmak için bu özelliği manifest dosyanızın <activity> veya <application> öğesinde ayarlayın:

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

Bu özellik true olarak ayarlanırsa etkinlik, bölünmüş ekran ve masaüstü pencere modlarında başlatılabilir. Özellik false olarak ayarlanırsa etkinlik çoklu pencere modunu desteklemez. Değer false ise ve kullanıcı etkinliği çok pencereli modda başlatmaya çalışırsa etkinlik tam ekranı kaplar.

Uygulamanız API düzeyi 24 veya sonraki sürümleri 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 (orta veya genişletilmiş pencere boyutu sınıfı): Tüm uygulamalar çok pencereli modu destekler. Bu özellik, bir etkinliğin yeniden boyutlandırılıp boyutlandırılamayacağını gösterir. resizeableActivity="false" ise uygulama, ekran boyutlarına uymak gerektiğinde uyumluluk moduna alınır.
  • Küçük ekranlar (compact pencere boyutu sınıfı): resizeableActivity="true" ve etkinliğin minimum genişliği ve minimum yüksekliği çok pencereli mod gereksinimleri dahilindeyse etkinlik çok pencereli modu destekler. resizeableActivity="false" ise etkinlik, minimum genişlik ve yükseklik değerlerinden bağımsız olarak çoklu pencere modunu desteklemez.

Uygulamanız API düzeyi 36 veya sonraki sürümleri hedefliyorsa bu özellik, en küçük genişliği >= 600 dp olan ekranlarda yoksayılır. Ancak uygulama, kullanıcının en boy oranı seçimini tamamen dikkate alır (bkz. Kullanıcı tarafından uygulama başına geçersiz kılmalar).

Oyun geliştiriyorsanız Android 16 (API seviyesi 36) değişikliklerinin dışında tutmak için Uygulama yönü, en boy oranı ve yeniden boyutlandırılabilirlik başlıklı makaleyi inceleyin.

supportsPictureInPicture

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

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

configChanges

Çoklu pencere yapılandırma değişikliklerini (ör. kullanıcı pencereyi yeniden boyutlandırdığında) kendiniz işlemek için uygulama manifestinizdeki android:configChanges özelliğini en az aşağıdaki değerlerle birlikte <activity> düğümüne ekleyin:

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

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

<layout>

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

  • android:defaultHeight, android:defaultWidth: Masaüstü pencereleme modunda başlatıldığında etkinliğin varsayılan yüksekliği ve genişliği.

  • android:gravity: Etkinliğin masaüstü pencere modunda başlatıldığında ilk yerleştirilmesi. Uygun değerler için Gravity sınıfına bakın.

  • android:minHeight, android:minWidth: Etkinliğin hem bölünmüş ekran hem de masaüstü pencereleme modlarındaki minimum yüksekliği ve minimum genişliği. Kullanıcı, bölünmüş ekran modunda ayırıcıyı hareket ettirerek bir etkinliği belirtilen minimum boyuttan daha küçük hale getirirse sistem, etkinliği kullanıcının istediği boyuta kırpar.

Aşağıdaki kodda, bir etkinliğin varsayılan boyutu ve konumu ile masaüstü pencere modunda görüntülendiğinde 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

Android 7.0'dan itibaren sistem, çok pencereli modda çalışabilen uygulamaları destekleyen işlevler sunar.

Çoklu pencere modunda devre dışı bırakılan özellikler

Android, çok pencereli modda cihaz ekranını diğer etkinlikler veya uygulamalarla paylaşan bir etkinlik için geçerli olmayan özellikleri devre dışı bırakabilir ya da yoksayabilir.

Ayrıca, bazı sistem kullanıcı arayüzü özelleştirme seçenekleri devre dışı bırakılır. Örneğin, uygulamalar çoklu pencere modunda çalışıyorsa 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 aramalar

Activity sınıfı, çok pencereli modu desteklemek için aşağıdaki yöntemleri sunar:

  • isInMultiWindowMode(): Etkinliğin çok pencereli modda olup olmadığını gösterir.

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

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

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

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

Pencere içinde pencere modu

Bir etkinliği pencere içinde pencere moduna geçirmek için enterPictureInPictureMode() yöntemini çağırın. Bu yöntem, cihaz pencere içinde pencere modunu desteklemiyorsa hiçbir etki yaratmaz. Daha fazla bilgi için Resim içinde resim (PiP) özelliğini kullanarak video ekleme başlıklı makaleyi inceleyin.

Çoklu pencere modunda yeni etkinlikler

Yeni bir etkinlik başlattığınızda, mümkünse yeni etkinliğin mevcut etkinliğin yanında gösterilmesi gerektiğini belirtebilirsiniz. Sisteme yeni etkinliği bitişik bir pencerede oluşturmayı denemesini söyleyen ve böylece iki etkinliğin ekranı paylaşmasını sağlayan amaç işaretini FLAG_ACTIVITY_LAUNCH_ADJACENT kullanın. Sistem bunu yapmak için elinden geleni yapar ancak bu durumun gerçekleşeceği garanti edilmez.

Bir cihaz masaüstü pencere modundaysa ve yeni bir etkinlik başlatıyorsanız ActivityOptions.setLaunchBounds() işlevini çağırarak yeni etkinliğin boyutlarını ve ekran konumunu belirtebilirsiniz. Cihaz çoklu pencere modunda değilse yöntemin etkisi olmaz.

API düzeyi 30 ve daha düşük sürümlerde, bir görev yığını içinde etkinlik başlattığınızda etkinlik, ekrandaki etkinliğin yerini alır ve çok pencereli tüm özelliklerini devralır. Yeni etkinliği çok pencereli modda ayrı bir pencere olarak başlatmak istiyorsanız 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 etkinlik arasında bölmesine olanak tanır. Bir XML yapılandırma dosyası oluşturarak veya Jetpack WindowManager API çağrıları yaparak uygulamanızın etkinliklerini nasıl göstereceğini (tam ekran, yan yana veya üst üste) belirleyebilirsiniz.

Sürükleme ve bırakma

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.) Bırakılan içeriğin kabul edilmesiyle ilgili desteği hızlıca eklemek için DropHelper API'sini inceleyin. Kapsamlı sürükle ve bırak rehberliği için Sürükle ve bırak özelliğini etkinleştirme başlıklı makaleyi inceleyin.

Çoklu örnek

Her kök etkinliğin 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şaretini kullanarak yeni etkinlikler başlatın. Yeni pencere için belirli bir konum istemek üzere bu ayarı çok pencereli özelliklerle birlikte kullanabilirsiniz. Örneğin, bir alışveriş uygulaması ürünleri karşılaştırmak için yan yana birden fazla pencere gösterebilir.

Android 12 (API düzeyi 31) ve sonraki sürümlerde, etkinlik yerleştirme özelliğinde aynı görev penceresinde bir etkinliğin iki örneğini yan yana başlatabilirsiniz.

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 istiyorsanız başlatıcı etkinliğinizin manifest dosyasında android:resizeableActivity="true" öğesini ayarlayın ve birden fazla örneği engelleyen bir başlatma modu kullanmayın. Örneğin, singleInstancePerTask etkinliği, FLAG_ACTIVITY_MULTIPLE_TASK veya FLAG_ACTIVITY_NEW_DOCUMENT ayarlandığında farklı görevlerde birden çok kez oluşturulabilir.

Android 15 (API düzeyi 35) ve sonraki sürümlerde, PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI çoklu örnek desteğini beyan etmenize olanak tanır. Bu özellik, sistem kullanıcı arayüzünün uygulamadan birden fazla örnek oluşturmak için kullanıcının erişimine kontroller sunması konusunda açık bir sinyaldir. Bu özellik, başlatma modundan bağımsızdır ancak yalnızca bir etkinliğin veya uygulamanın başlatma modu bu özellikle uyumlu olduğunda (ör. başlatma modu singleInstance olmadığında) kullanılmalıdır.

Katlanabilir bir cihazda bir uygulamanın birden fazla örneği ayrı pencerelerde çalışırken cihazın duruşu değişirse bir veya daha fazla örnek arka plana gönderilebilir. Örneğin, katlanmamış bir cihazın kat yerinin her iki tarafında ayrı pencerelerde çalışan iki uygulama örneği olduğunu varsayalım. Cihaz katlıysa her iki örneğin pencerelerini daha küçük bir ekrana sığdırmaya çalışmak yerine örneklerden biri sonlandırılabilir.

Çoklu pencere modu doğrulama

Uygulamanızın API düzeyi 24 veya sonraki sürümleri hedefleyip hedeflemediğine bakılmaksızın, Android 7.0 veya sonraki sürümleri çalıştıran bir cihazda çoklu pencere modunda başlatılmaya çalışılması durumunda uygulamanızın nasıl davrandığını doğrulamanız gerekir.

Test cihazları

Android 7.0 (API seviyesi 24) veya sonraki sürümlerin yüklü olduğu cihazlar çoklu pencere modunu destekler.

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

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

Uygulamanız sabit bir yön belirtmiyorsa uygulamanızı Android 7.0 veya sonraki bir sürümün yüklü olduğu bir cihazda başlatıp bölünmüş ekran moduna almaya çalışmalısınız. Uygulama zorunlu olarak yeniden boyutlandırıldığında kullanıcı deneyiminin kabul edilebilir olduğunu doğrulayın.

Uygulama sabit bir yönlendirme bildiriyorsa uygulamayı çoklu pencere moduna almaya çalışmalısınız. Bu işlemi yaptığınızda uygulamanın tam ekran modunda kaldığını doğrulayın.

API düzeyleri 24-30

Uygulamanız 24-30 arasındaki API düzeylerini hedefliyorsa ve çoklu pencere desteğini devre dışı bırakmıyorsa hem bölünmüş ekran hem de masaüstü pencere modlarında aşağıdaki davranışları doğrulayın:

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

  • Uygulamayı doğrudan çoklu pencere modunda başlatın ve uygulamanın düzgün şekilde başlatıldığını doğrulayın. Son Kullanılanlar düğmesine basıp uygulamanızın başlık çubuğuna uzun basarak ve başlık çubuğunu ekrandaki vurgulanmış alanlardan birine sürükleyerek uygulamayı çoklu pencere modunda başlatabilirsiniz.

  • Ekran ayırıcıyı sürükleyerek bölünmüş ekran modunda uygulamanızı 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 pencere boyutu bu boyutlardan daha küçük olacak şekilde uygulamayı yeniden boyutlandırmayı deneyin. Uygulamanın, belirtilen minimum boyutlardan daha küçük olacak şekilde yeniden boyutlandırılamadığını doğrulayın.

  • Tüm testler boyunca uygulamanızın performansının kabul edilebilir 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 süre geçmediğini doğrulayın.

API düzeyi 31 veya üstü

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

Test yapılacaklar listesi

Uygulamanızın çok pencereli moddaki performansını doğrulamak için aşağıdaki işlemleri deneyin. Aksi belirtilmediği sürece bu işlemleri hem bölünmüş ekran hem de masaüstü pencere modunda denemeniz gerekir.

  • Çoklu pencere moduna girme ve bu moddan çıkma

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

  • Bölünmüş ekran modunda, ekran ayırıcıyı hareket ettirerek uygulamanızı hem büyütebilir hem de küçültebilirsiniz. Bu işlemleri hem yan yana hem de üst üste yapılandırmalarda 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.

  • Hızlı bir şekilde art arda birkaç yeniden boyutlandırma işlemi gerçekleştirme Uygulamanızın kilitlenmediğini veya bellek sızdırmadığını doğrulayın. Android Studio'nun Memory Profiler'ı, uygulamanızın bellek kullanımı hakkında bilgi sağlar (bkz. Memory Profiler ile uygulamanızın bellek kullanımını inceleme).

  • Uygulamanızı farklı pencere yapılandırmalarında normal şekilde kullanın ve uygulamanın düzgün çalıştığını doğrulayın. Metnin okunabilir olduğundan ve kullanıcı arayüzü öğelerinin etkileşimde bulunulamayacak kadar küçük olmadığından emin olun.

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

API düzeyleri 24-30'da, android:resizeableActivity="false" ayarını yaparak çoklu pencere desteğini devre dışı bıraktıysanız uygulamanızı Android 7.0-11 çalıştıran bir cihazda başlatmalı ve uygulamayı bölünmüş ekran ile masaüstü pencere modlarına almaya çalışmalısınız. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığını doğrulayın.

Ek kaynaklar

Android'de çoklu pencere desteği hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın: