Çoklu pencere desteği

Çoklu pencere modu, birden fazla uygulamanın aynı ekranı eş zamanlı olarak paylaşmasını sağlar. Uygulamalar yan yana veya üst üste (bölünmüş ekran modu), küçük bir pencerede diğer uygulamalarla yer paylaşımlı olarak bir uygulama (pencere içinde pencere modu) veya ayrı taşınabilir, yeniden boyutlandırılabilir pencerelerde (serbest biçimli mod) ayrı ayrı uygulamalar olabilir.

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

Kullanıcı deneyimi, Android OS 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, belirli cihazlarda ise pencere içinde pencere modunu kullanıma sunmuştur.

    Bölünmüş ekran modu, ekranı iki uygulamayla doldurur. İki uygulamayı yan yana veya üst üste gösterir. Kullanıcılar, iki uygulamayı birbirinden ayıran ayırıcıyı sürükleyerek birini büyütebilir, diğerini küçültebilir.

    Pencere içinde pencere modu, kullanıcıların başka bir uygulama ile etkileşimde bulunurken videoyu oynatmaya devam etmesine olanak tanır (bkz. Pencere içinde pencere desteği).

    Büyük ekranlı cihaz üreticileri, kullanıcıların her bir etkinliği istedikleri şekilde yeniden boyutlandırabildiği serbest biçim modunu etkinleştirebilir.

    Etkinliğinizin izin verilen minimum boyutlarını belirterek uygulamanızın çoklu pencere modunu nasıl kullanacağını yapılandırabilirsiniz. Ayrıca, sistemin uygulamanızı her zaman tam ekran göstermesini sağlamak için resizeableActivity="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 hale getirir.

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

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

    Not: Cihaz üreticileri bu davranışları geçersiz kılabilir.

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ı ekrana kaydırın
  3. Uygulama başlık çubuğundaki uygulama simgesine basın
  4. Bölünmüş ekran menü seçeneğini belirleme
  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 veya sağa) sürükleyerek bölünmüş ekran modundan çıkabilirler.

Bitişikte başlat

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

Bölünmüş ekran modunda çalışan uygulamaların etkinlikleri bitişik pencerede başlatabilmesi için Android 7.0 (API düzeyi 24) sürümünde FLAG_ACTIVITY_LAUNCH_ADJACENT kullanıma sunulmuştur.

Android 12L (API düzeyi 32) ve sonraki sürümler, tam ekran çalışan uygulamaların bölünmüş ekran modunu etkinleştirip etkinlikleri bitişik pencerede başlatmasını sağlamak için işaretin tanımını genişletmiştir.

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. Ancak birden fazla penceredeki uygulamaların devam ettirilme durumu Android'in farklı sürümlerinde farklılık 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. Şeffaf bir etkinlik etkinliğin üst kısmındaysa veya etkinliğe odaklanılamıyorsa (örneğin, pencere içinde pencere modu) etkinlik duraklatılabilir. Ayrıca, belirli bir zamanda (örneğin, bildirim çekmecesi açık olduğunda) hiçbir etkinliğe odaklanılmamış olması da mümkündür. onStop yöntemi her zamanki gibi çalışır; bir etkinlik ekrandan her kaldırıldığında çağrılır.

Çoklu devam ettirme, Android 9 (API düzeyi 28) ç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 özelliklerine 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 şeklindedir ancak RESUMED değildir. Bununla birlikte, sistem bu görünür ancak devam ettirilmeyen etkinliklere görünür olmayan etkinliklere göre daha yüksek öncelik verir. Kullanıcı görünen etkinliklerden biriyle etkileşimde bulunursa bu etkinlik devam ettirilir ve önceki en üstteki etkinlik STARTED durumuna geçer.

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 geçirdiğinde sistem, Yapılandırma değişikliklerini işleme bölümünde belirtildiği gibi bir yapılandırma değişikliği etkinliğini bildirir. Bu durum, kullanıcı uygulamayı yeniden boyutlandırdığında veya tekrar tam ekran moduna aldığında da meydana gelir.

Esas olarak bu değişiklik, uygulamanın dikey yönden yatay yöne geçtiğini uygulamaya bildirdiği zamanla aynı etkinlik yaşam döngüsünü etkiler. Tek fark, cihaz boyutlarının değiştirilmesi yerine değiştirilmesidir. Yapılandırma değişikliklerini işleme bölümünde açıklandığı gibi, etkinliğiniz yapılandırma değişikliğini yönetebilir veya sistemin etkinliği kaldırmasına ve yeni boyutlarla yeniden oluşturmasına izin verebilir.

Kullanıcı bir pencereyi yeniden boyutlandırıyor ve her iki boyutta da pencereyi büyütüyorsa 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 yapmada geride kalırsa sistem bu alanları geçici olarak windowBackground veya varsayılan windowBackgroundFallback stil özelliğinde belirtilen renkle doldurur.

Özel kaynak erişimi

Çoklu devam ettirme özelliğini desteklemeye yardımcı olmak için yeni bir yaşam döngüsü geri çağırma özelliği sunulmuştur: onTopResumedActivityChanged().

Bu yöntem, bir etkinlik devam ettirilen en üstteki etkinlik konumunu kazandığında veya kaybettiğinde çağrılır. Bir etkinlikte mikrofon veya kamera gibi paylaşılan tek bir kaynak kullanıldığını bilmeniz ö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 kaynaklarını kaybedebileceğini unutmayın.

Her durumda, uygulamalar mevcut kaynakları etkileyen etkinlikleri ve durum değişikliklerini sorunsuz bir şekilde ele almalıdır.

Kamera kullanan uygulamalar için CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged(), kameraya erişmeye çalışmak için 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 diğer ekranlarda açılabileceğinden resizeableActivity=false ürününün özel kamera erişimini garanti etmediğini unutmayın.

Kamera çoklu pencere modunda.

2. Şekil. Kamera çoklu pencere modunda.

Odağı kaybolduğunda uygulamanızın kamerayı bırakması gerekmez. Örneğin, kullanıcı en üstte odaklanılan yeni uygulamayla etkileşim kurarken kamera önizlemesini devam ettirmek isteyebilirsiniz. En çok devam ettirilen uygulama olmadığı halde, uygulamanızın kamerayı çalıştırmaya devam etmesi sorun yaratmaz, ancak bağlantı kesilen kılıfı düzgün bir şekilde işlemesi gerekir. En üstte devam ettirilen uygulama kamerayı kullanmak istediğinde kamerayı açabilir ve uygulamanız erişimi kaybeder. Uygulama, odağı tekrar geri aldığında kamerayı yeniden açabilir.

Bir uygulama CameraDevice.StateCallback#onDisconnected() geri çağırması aldıktan sonra, kamera cihazından sonraki çağrılarda bir CameraAccessException döndürülür.

Çoklu Ekran

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

Bir uygulama, başlatıldığında veya başka bir etkinlik oluşturduğunda hangi ekranda çalışması gerektiğini belirtebilir. Bu davranış, manifest dosyasında tanımlanan etkinlik başlatma moduna ve etkinliği başlatan varlık tarafından ayarlanan amaç bayraklarına ve seçeneklere bağlıdır. Daha fazla bilgi için ActivityOptions sayfasını inceleyin.

Bir etkinlik ikincil bir ekrana taşındığında bağlam güncellemesi, pencere yeniden boyutlandırma, yapılandırma ve kaynak değişikliklerinden geçebilir. Yapılandırma değişikliğini etkinlik gerçekleştiriyorsa etkinlik, onConfigurationChanged()'te bilgilendirilir; aksi takdirde yeniden başlatılır.

Yapılandırma değişikliği yapılıyorsa bir etkinlik, onCreate ve onConfigurationChanged uygulamaları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 bir ekranda başlatmak etkinliğin yeni bir örneğini oluşturabilir. Her iki etkinlik de aynı anda devam ettirilir.

Bir etkinliğin birden fazla ekranda birden çok örneği.

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

Ayrıca, Android 8.0'da kullanıma sunulan çok ekranlı API'ler hakkında bilgi de edinmek isteyebilirsiniz.

Etkinlik ve uygulama bağlamı

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

Etkinlik bağlamı, ekranla ilgili bilgiler içerir ve her zaman etkinliğin göründüğü görüntüleme alanına göre ayarlanır. Bu sayede, uygulamanızın şu anda sahip olduğu görüntü yoğunluğu veya pencere metrikleri hakkında doğru bilgileri edinebilirsiniz. Geçerli 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ı) kullanıyor olmanız gerekir. Bu durum, bağlamdan alınan bilgileri kullanan bazı sistem API'lerini de etkiler (örneğin, Bildirim mesajlarına genel bakış bölümüne bakın).

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

Kotlin

val activityDisplay = activity.getDisplay()

Java

Display activityDisplay = activity.getDisplay();

Geçerli etkinlik aralığı metriklerini alın:

Kotlin

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

Java

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

Mevcut sistem yapılandırması için maksimum aralık metriklerini alın:

Kotlin

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

Java

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

Maksimum aralık metrikleri hesaplamalar, düzen seçimleri veya önceden getirilecek kaynakların boyutunu belirlemek için kullanılır. onCreate() ürününde bu bilgilerin mevcut olması, bu kararları ilk düzen geçişinden önce almanızı sağlar. 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 şekillerine sahip olabilir. Kesme sorunlarını önlemek için Ekran kesimi desteğiyle ilgili en iyi uygulamalar konusunu okuyun.

İkincil ekranlar

Kullanılabilir ekranları DisplayManager sistem hizmetinden alabilirsiniz:

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 güvenli olup olmadığını belirten işaretler gibi belirli bir ekran hakkında bilgi edinmek için Display sınıfını kullanın. Bununla birlikte, görüntü boyutunun uygulamanıza ayrılan görüntüleme alanıyla aynı olacağını varsaymayın. Çoklu pencere modunda, uygulamanızın ekranın bir kısmını kapladığını unutmayın.

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

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

Ardından 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 bir klavye gösterilebilir. Bir metin alanı söz konusu ekranda giriş isterse giriş yöntemi düzenleyicisi otomatik olarak görünür.

Klavye ikincil ekranda.

4. Şekil. Klavye ikincil ekranda.

Duvar kağıdı

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

Telefondaki ve ikincil ekranda duvar kağıdı.

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

Launcher'lar

Yeni amaç filtresi kategorisi (SECONDARY_HOME), ikincil ekranlar için özel bir etkinlik sağlar. Etkinlik örnekleri, sistem süslemelerini destekleyen tüm ekranlarda her ekran için bir tane olacak şekilde 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 için AOSP uygulaması bir SECONDARY_HOME etkinliğini destekler.

Telefondaki Materyal Tasarım başlatıcı.

6. Şekil. Telefondaki Materyal Tasarım başlatıcı.

İkinci ekranda Materyal Tasarım başlatıcı.

7. Şekil. İkinci 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 benzer işlevler sunar ancak API düzeyi 14'e geriye dönük uyumluluk sunar.

Geçerli ekran dışındaki görüntülere ilişkin metrikleri almak için aşağıdakileri yapın:

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

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() API düzeyi 30'da kullanımdan kaldırılarak yerine yeni WindowManager yöntemleri kullanılmaya başlandı.

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

Çok pencere modu yapılandırması

Uygulamanız Android 7.0 (API düzeyi 24) veya sonraki bir sürümü hedefliyorsa uygulamanızın etkinliklerinin çoklu pencere modunu destekleyip desteklemediğini yapılandırabilirsiniz. Hem boyutu hem de düzeni kontrol etmek için manifest dosyanızda öznitelikler ayarlayabilirsiniz. Bir kök etkinliğin özellik ayarları, görev yığınındaki tüm etkinliklere uygulanır. Örneğin, kök etkinlikte android:resizeableActivity="true" bulunuyorsa 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ın bozulmasına neden olursa filtreleri kullanarak uygulamanızın bu tür cihazlardaki kullanılabilirliğini kısıtlayabilirsiniz.

Android 12 (API düzeyi 31) varsayılan olarak çoklu pencere moduna geçer. Büyük ekranlarda (sw >= 600 dp), tüm uygulamalar, uygulama yapılandırmasından bağımsız olarak çoklu pencere modunda çalışır. Küçük ekranlarda, sistem bir etkinliğin çoklu pencere modunda çalışıp çalışmayacağını belirlemek için etkinliğin minWidth, minHeight ve resizeableActivity ayarlarını kontrol eder.

yeniden boyutlandırma etkinliği

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

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

Bu özellik true (doğru) değerine ayarlanırsa etkinlik, bölünmüş ekran ve serbest biçim modlarında başlatılabilir. Özellik false (yanlış) değerine ayarlanırsa etkinlik, çoklu pencere modunu desteklemez. Bu değer false ise ve kullanıcı, etkinliği çoklu pencere modunda başlatmaya çalışırsa etkinlik tüm 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 true 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ı ifade eder. resizeableActivity="false" ise uygulama, görüntüleme boyutlarına uyması gerektiğinde uyumluluk moduna alınır.
  • Küçük ekranlar (sw < 600dp): resizeableActivity="true" ve etkinliğin minimum genişliği ve minimum yüksekliği çoklu pencere gereksinimlerini karşılıyorsa etkinlik, çoklu pencere modunu destekler. resizeableActivity="false" ise etkinlik, minimum genişlik ve yüksekliğine bakılmaksızın çoklu pencere modunu desteklemez.

desteklenenResim İçinde Resim

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

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

configChanges

Kullanıcının pencereyi yeniden boyutlandırması gibi çoklu pencere yapılandırma değişikliklerini kendiniz işlemek için android:configChanges özelliğini, en az aşağıdaki değerleri kullanarak uygulama manifestinizin <activity> düğümüne ekleyin:

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

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

<düzen>

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 bkz. Gravity.
android:minHeight, android:minWidth
Hem bölünmüş ekran hem de serbest biçim modlarında etkinlik için minimum yükseklik ve minimum genişlik. Kullanıcı, bir etkinliği belirtilen minimum değerden daha küçük hale getirmek için ayırıcıyı bölünmüş ekran modunda hareket ettirirse sistem, etkinliği kullanıcının istediği boyuta göre kırpar.

Aşağıdaki kod, etkinlik serbest biçim modunda görüntülenirken bir etkinliğin varsayılan boyutunun ve konumunun nasıl belirtileceğini ve minimum boyutunun nasıl belirtileceğini gösterir:

<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, çoklu pencere modunda çalışabilen uygulamaları destekleyecek işlevler sunar.

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

Android, çoklu pencere modunda cihaz ekranını diğer etkinliklerle 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 ç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ı belirtir.

Not: Pencere içinde pencere modu, çoklu pencere modunun özel bir durumudur. myActivity.isInPictureInPictureMode() doğru değerini döndürürse myActivity.isInMultiWindowMode() de true değerini döndürür.

onMultiWindowModeChanged()
Etkinlik, çoklu pencere moduna girdiğinde veya bu moddan her çıktığında sistem bu yöntemi çağırır. Etkinlik çoklu pencere moduna giriyorsa sistem yönteme true (doğru), etkinlik çoklu pencere modundan çıkıyorsa false (yanlış) değerini aktarır.
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, yönteme doğru değerini, etkinlik pencere içinde pencere modundan çıkıyorsa false değerini aktarır.

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

Pencere içinde pencere modu

Bir etkinliği pencere içinde pencere moduna geçirmek için enterPictureInPictureMode() numaralı telefonu arayın. Cihaz pencere içinde pencere modunu desteklemiyorsa bu yöntemin etkisi yoktur. Daha fazla bilgi için Pencere içinde pencere desteğine göz atın.

Ç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. Sisteme yeni etkinliği bitişik bir pencerede oluşturmayı denemesini söyleyen intent işaretini FLAG_ACTIVITY_LAUNCH_ADJACENT kullanın. Böylece iki etkinlik aynı ekranı paylaşır. Sistem bunun için elinden geleni yapsa da gerçekleşeceği garanti edilmez.

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

API düzeyi 30 ve önceki sürümlerde bir görev yığını içinde bir etkinlik başlatırsanız bu etkinlik, ekrandaki etkinliğin yerini alarak tüm çoklu pencere özelliklerini devralır. Yeni etkinliği çoklu pencere modunda ayrı bir pencere olarak başlatmak isterseniz 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 (tam ekran, yan yana veya yığınlı) nasıl görüntüleyeceğini belirlersiniz.

Sürükleyin ve bırakın

Kullanıcılar, iki etkinlik ekranı paylaşırken verileri bir etkinlikten diğerine sürükleyip bırakabilir. (Android 7.0'dan önce, kullanıcılar tek bir etkinlik içinde verileri sürükleyip bırakabiliyordu.) Bırakılan içeriğin kabul edilmesiyle ilgili desteği hızlı bir şekilde eklemek için DropHelper API'ye bakın. Kapsamlı sürükleme ve bırakma yönergeleri için Sürükleme ve bırakma bölümüne bakın.

Çok Örnekli

Her kök etkinliğinin, ayrı bir işlemde çalışan ve kendi penceresinde gösterilen kendi görevi vardır. Ayrı bir pencerede uygulamanızın yeni bir örneğini 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ı, ürünleri karşılaştırmak için birden fazla pencere görüntüleyebilir.

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

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 android:resizeableActivity="true" ayarını yaptığından ve birden fazla örneği engelleyen başlatma modunu kullanmadığından emin olun. Örneğin, FLAG_ACTIVITY_MULTIPLE_TASK veya FLAG_ACTIVITY_NEW_DOCUMENT ayarlandığında singleInstancePerTask etkinliği farklı görevlerde birden çok kez örneklenebilir.

Çoklu örneği, tek bir pencerede çalışan SlidingPaneLayout kullanan list-detail sunumu gibi çok panelli bir düzenle karıştırmayın.

Katlanabilir bir cihazda ayrı pencerelerde birden fazla örnek çalışırken, durumun farklı olması halinde bir veya daha fazla örneğin arka plana gönderilebileceğini unutmayın. Örneğin, bir cihazın açıldığını ve ekranın her iki tarafında iki pencerede çalışan iki uygulama örneğinin bulunduğunu varsayalım. Cihaz katlanmışsa her iki örnek için de pencerelere daha küçük ekran sığdırmaya çalışmak yerine örneklerin biri sonlandırılabilir.

Çoklu pencere modu doğrulaması

Uygulamanız API düzeyi 24 veya üstünü hedeflese de hedeflemese de, bir kullanıcının Android 7.0 veya sonraki sürümleri çalıştıran bir cihazda çok pencereli modda başlatmaya çalıştığında ç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 altı

Kullanıcılar uygulamayı çoklu pencere modunda kullanmayı denediğinde, uygulama sabit bir yön bildirmediği sürece sistem uygulamayı zorla yeniden boyutlandırır.

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

Uygulama sabit bir yön bildirirse birden fazla pencere moduna almayı denemeniz gerekir. Bunu yaptığınızda, uygulamanın tam ekran modunda kaldığını doğrulayın.

24-30 arasındaki API düzeyleri

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 serbest biçimli modlarda aşağıdaki davranışı doğrulayın:

  • Uygulamayı tam ekran modunda 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ığını doğrulayın.
  • Uygulamayı doğrudan çoklu pencere modunda başlatın ve uygulamanın düzgün şekilde başlattığını doğrulayın. Bir uygulamayı çoklu pencere modunda başlatmak için Son Kullanılanlar düğmesine basın, ardından uygulamanızın başlık çubuğuna uzun basıp ekranda vurgulanan alanlardan birine sürükleyin.
  • 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 belirttiyseniz uygulamayı bu boyutların altında 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 testlerden yararlanarak 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ün güncellenmesinde ç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 az veya buna eşitse 24-30 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 belirtilmediği sürece, bu işlemleri hem bölünmüş ekran modunda hem de serbest biçimli modda denemeniz gerekir.

  • Çoklu pencere moduna girip bu moddan çıkın.
  • Uygulamanızdan başka bir uygulamaya geçin ve uygulamanın görünür olmasına rağmen 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 yapmak için ekran ayırıcıyı hareket ettirmeyi deneyin. Bu işlemleri yan yana ve diğer yapılandırmaların üzerinde olacak şekilde deneyin. Uygulamanın kilitlenmediğini, temel işlevin görünür olduğunu ve yeniden boyutlandırma işleminin çok uzun sürmediğini doğrulayın.
  • Hızlı bir şekilde arka arkaya birkaç yeniden boyutlandırma işlemi gerçekleştirin. Uygulamanızın kilitlenmediğini veya bellek sızıntısı olmadığını doğrulayın. Android Studio'nun Bellek Profil Aracı, uygulamanızın bellek kullanımı hakkında bilgi sağlar (bkz. Bellek Profil Aracı ile uygulamanızın bellek kullanımını inceleme).
  • Uygulamanızı birkaç farklı pencere yapılandırmasında normal şekilde kullanın ve uygulamanın düzgün bir şekilde çalıştığı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-30 arasındaki API düzeylerinde, android:resizeableActivity="false" ayarını yaparak ç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 başlatmalı ve uygulamayı bölünmüş ekran ve serbest biçim modlarına getirmeyi denemelisiniz. 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 edinmek için aşağıdaki sayfaları inceleyin: